0 Tage Serie
javascript / expert
Snippet

Zero-Copy-Transfers via MessagePort

In Node.js Worker-Threads können Sie eine Transferliste (das zweite Argument von postMessage) verwenden, um Speicher zu verschieben, anstatt ihn zu klonen. Dies ist hocheffizient für große Datensätze, da der Overhead für das Kopieren von Bytes zwischen Threads entfällt.

snippet.js
javascript
1
2
3
4
5
6
7
8
9
const { Worker, MessageChannel } = require('node:worker_threads');
const { port1, port2 } = new MessageChannel();
const buffer = new Uint8Array(1024 * 1024 * 100); // 100MB
// Transfer the underlying ArrayBuffer without copying data
port1.postMessage({ data: buffer }, [buffer.buffer]);
console.log(buffer.byteLength); // 0 (Memory was moved, not copied)
nodejs
Erklärung
1
postMessage({ data: buffer }, [buffer.buffer])
Das zweite Argument gibt an, welche ArrayBuffers übertragen werden sollen.
2
buffer.byteLength
Nach der Übertragung wird der ursprüngliche Puffer abgetrennt und seine Länge wird Null.