【发布时间】:2016-05-08 17:54:14
【问题描述】:
这是一个关于系统级优化的概念查询。通过阅读 NodeJS 文档,我的理解是管道可以方便地对流执行流控制。
背景:我有麦克风流进入,我想避免额外的复制操作以节省整个系统的 MIPS。我知道对于音频流,即使引擎盖下有一个 memcopy,也不会花费大量的 MIPS,但我还计划扩展一个扩展,以 30fps 和 UHD 分辨率流式传输摄像机帧。以 30fps 的速度制作多份 UHD 分辨率像素数据的效率非常低,因此需要一些建议。
示例代码:
var spawn = require('child_process').spawn
var PassThrough = require('stream').PassThrough;
var ps = null;
//var audioStream = new PassThrough;
//var infoStream = new PassThrough;
var start = function() {
if(ps == null) {
ps = spawn('rec', ['-b', 16, '--endian', 'little', '-c', 1, '-r', 16000, '-e', 'signed-integer', '-t', 'raw', '-']);
//ps.stdout.pipe(audioStream);
//ps.stderr.pipe(infoStream);
exports.audioStream = ps.stdout;
exports.infoStream = ps.stderr;
}
};
var stop = function() {
if(ps) {
ps.kill();
ps = null;
}
};
//exports.audioStream = audioStream;
//exports.infoStream = infoStream;
exports.startCapture = start;
exports.stopCapture = stop;
以下是问题:
- 为了能够执行流控制,source.pipe(dest) 是在后台执行从源内存到目标内存的 memcpy,还是会将内存中的引用传递到目标?
- 注释的代码包含一个 PassThrough 类实例化 - 我目前假设 PassThrough 也会导致 memcopies,因此我在整个系统中保存了一个 memcpy 操作,因为我在上面的 cmets 中添加了?
- 如果我必须在进程和生成的子进程之间创建一个管道(使用 How to transfer/stream big data from/to child processes in node.js without using the blocking stdio? 中所示的 child_process.spawn()),我认为这肯定会导致 memcpy?反正有没有做参考而不是复制?
- 此行为是否因操作系统而异?我认为它应该与操作系统无关,但无论如何都要问这个问题。
提前感谢您的帮助。这将对我的架构有很大帮助。
【问题讨论】: