ผู้ปฏิบัติงาน ♥ ArrayBuffer

จาก crbug.com/73313 การสนับสนุน Chrome 13 และ FF5 ที่ส่ง ArrayBuffer (หรือ Typed Array) ไปยัง/จาก Web Worker เช่น

worker.js

self.onmessage = function(e) {
    var uInt8Array = e.data;
    postMessage("Inside worker.js: uInt8Array.toString() = " + uInt8Array.toString());
    postMessage("Inside worker.js: uInt8Array.byteLength = " + uInt8Array.byteLength);
};

main.html

var uInt8Array = new Uint8Array(new ArrayBuffer(10));
for (var i = 0; i < uInt8Array.length; ++i) {
    uInt8Array[i] = i * 2; // [0, 2, 4, 6, 8,...]
}

console.log('uInt8Array.toString() = ' + uInt8Array.toString());
console.log('uInt8Array.byteLength = ' + uInt8Array.byteLength);

worker.postMessage(uInt8Array);

ทำไมเรื่องนี้จึงน่าตื่นเต้น...ข้อมูลไบนารี!

เบราว์เซอร์จะใช้อัลกอริทึมการโคลนที่มีโครงสร้าง เพื่อคัดลอก ArrayBuffer ไปยังบริบทของผู้ปฏิบัติงาน แทนการที่เบราว์เซอร์ทำให้ข้อมูล postMessage() เป็นอนุกรมไปยังออบเจ็กต์ JSON ซึ่งช่วยให้พนักงานมีศักยภาพอย่างแท้จริงที่เราไม่เคยเห็นมาก่อน กล่าวคือความสามารถในการส่งข้อมูลไบนารีระหว่างแอปหลักและเทรดผู้ปฏิบัติงาน

I/O อาร์เรย์แบบพิมพ์ทำให้การควบคุมภาพอย่างเข้มข้น การประมวลผลเสียง และการคำนวณ WebGL แบบจำนวนมากเป็นไปได้มากกว่า เช่น คนหนึ่งอาจอ่านไฟล์เป็นบัฟเฟอร์อาร์เรย์ หรือดึงข้อมูล Blob โดยใช้ XHR2 แล้วส่งต่อผลลัพธ์ไปยังผู้ปฏิบัติงานโดยตรง ไม่ต้องเข้ารหัสข้อมูล base64 อีกแล้ว :)

ในความคิดของผม ผมคิดว่าคนทำงานเหล่านี้ที่ควรใส่มาตั้งแต่ต้น ฟังแต่สมเหตุสมผล