這是關於系統級優化的概念性查詢。通過閱讀NodeJS文檔,我的理解是管道可以方便地對流進行流量控制。.pipe()是否在node.js中執行memcpy?
背景:我有麥克風流進來,我想避免額外的複製操作來保存整個系統的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操作,因爲我在上面的註釋中添加了?
- 如果我必須在Process和Spawned Child進程之間創建一個管道(使用child_process.spawn(),如How to transfer/stream big data from/to child processes in node.js without using the blocking stdio?所示),我認爲這肯定會導致memcpy?無論如何要做出參考而不是複製?
- 此行爲不同於OS到OS?我認爲它應該是操作系統不可知論的,但無論如何都要問這個問題。
在此先感謝您的幫助。這將有助於我的架構很多。