วัตถุที่ถ่ายโอนได้ - เร็วมาก

Chrome 13 เปิดตัวการส่ง ArrayBuffer ไปยัง/จาก Web Worker โดยใช้อัลกอริทึมที่เรียกว่าการโคลนโครงสร้าง การดำเนินการนี้ช่วยให้ postMessage() API ยอมรับข้อความที่ไม่ใช่แค่สตริง แต่รวมถึงประเภทที่ซับซ้อน เช่น ออบเจ็กต์ File, Blob, ArrayBuffer และ JSON ได้ นอกจากนี้ Firefox เวอร์ชันที่ใหม่กว่ายังรองรับการโคลนที่มีโครงสร้างด้วย

ยิ่งเร็วยิ่งดี

การโคลนที่มีโครงสร้างนั้นยอดเยี่ยม แต่ก็ยังเป็นการคัดลอกอยู่ ค่าใช้จ่ายในการส่ง ArrayBuffer ขนาด 32 MB ไปยังผู้ปฏิบัติงานอาจกินเวลาหลายร้อยมิลลิวินาที เบราว์เซอร์เวอร์ชันใหม่มีการปรับปรุงประสิทธิภาพอย่างมากสำหรับการส่งข้อความที่เรียกว่า Transferable Objects

เมื่อใช้ออบเจ็กต์ที่โอนได้ ระบบจะโอนข้อมูลจากบริบทหนึ่งไปยังอีกบริบทหนึ่ง เอกสารนี้จะทำงานได้ไม่มีสำเนา ซึ่งช่วยปรับปรุงประสิทธิภาพในการส่งข้อมูลไปยังผู้ปฏิบัติงานได้เป็นอย่างมาก หากคุณมาจากกลุ่ม C/C++ ให้คิดว่านี่เป็นการอ้างอิง อย่างไรก็ตาม "เวอร์ชัน" จากบริบทการโทรจะใช้งานไม่ได้อีกต่อไปเมื่อโอนไปยังบริบทใหม่ ซึ่งต่างจากการอ้างอิงแบบอ้างอิง เช่น เมื่อโอน ArrayBuffer จากแอปหลักไปยัง Worker ระบบจะล้าง ArrayBuffer เดิมและจะใช้ไม่ได้อีกต่อไป โดยระบบจะโอนเนื้อหาของไฟล์ไปยังบริบทของผู้ปฏิบัติงาน (โดยเงียบๆ)

มี postMessage() เวอร์ชันใหม่ที่รองรับออบเจ็กต์ที่โอนได้เพื่อเล่นกับรายการที่โอนได้ ดังนี้

worker.postMessage(arrayBuffer, [transferableList]);
window.postMessage(arrayBuffer, targetOrigin, [transferableList]);

สำหรับกรณีผู้ปฏิบัติงาน อาร์กิวเมนต์แรกคือข้อความ ArrayBuffer อาร์กิวเมนต์ที่ 2 คือรายการต่างๆ ที่ควรโอน ในตัวอย่างนี้ คุณจะระบุ arrayBuffer ในรายการที่โอนได้

การสาธิตการเปรียบเทียบ

เราได้จัดทำการสาธิตเพื่อดูประสิทธิภาพที่เพิ่มขึ้นของรายการที่โอนได้

เดโมจะส่ง ArrayBuffer ขนาด 32 MB ให้ผู้ปฏิบัติงานและส่งกลับโดยใช้ postMessage() หากเบราว์เซอร์ไม่รองรับการโอนได้ ตัวอย่างจะกลับไปเป็นการโคลนที่มีโครงสร้าง ได้เฉลี่ย 5 ครั้งในเบราว์เซอร์ที่ต่างกัน นี่คือสิ่งที่ฉันได้รับ

แผนภูมิการโคลนที่มีโครงสร้างเทียบกับออบเจ็กต์ที่โอนได้

สำหรับ MacBook Pro/10.6.8/2.53 GHz/Intel Core 2 Duo ระบบของ FF เป็นวิธีที่เร็วที่สุดในการใช้การโคลนที่มีโครงสร้าง โดยเฉลี่ยแล้ว การส่ง ArrayBuffer ขนาด 32 MB ให้ผู้ปฏิบัติงานและส่งกลับไปยังเทรดหลัก (RRT - Round-trip Time) ต้องใช้เวลาโดยเฉลี่ย 302 มิลลิวินาที เมื่อเปรียบเทียบกับรายการที่โอนได้ การทดสอบเดียวกันใช้เวลา 6.6 มิลลิวินาที กระตุ้น Perf ได้อย่างยอดเยี่ยมเลยทีเดียว

การมีความเร็วระดับนี้ช่วยให้สามารถส่งต่อพื้นผิว/พื้นผิวของ WebGL ขนาดใหญ่ไประหว่างผู้ปฏิบัติงานและแอปหลักได้อย่างราบรื่น

การตรวจหาฟีเจอร์

การตรวจหาฟีเจอร์ค่อนข้างยากสำหรับฟีเจอร์นี้ เราขอแนะนำให้ส่งArrayBufferขนาดเล็กไปให้ผู้ปฏิบัติงานของคุณ หากมีการโอนบัฟเฟอร์และไม่ได้คัดลอก .byteLength ของบัฟเฟอร์จะตกเป็น 0:

var ab = new ArrayBuffer(1);
worker.postMessage(ab, [ab]);
if (ab.byteLength) {
    alert('Transferables are not supported in your browser!');
} else {
    // Transferables are supported.
}

รองรับ: ปัจจุบันใช้ Chrome 17 ขึ้นไป, Firefox, Opera, Safari และ IE10 ขึ้นไป

อัปเดต (13-12-2011): ข้อมูลโค้ดที่แสดงลายเซ็น webkitPostMessage() แตกต่างกันสำหรับหน้าต่างและผู้ปฏิบัติงาน อัปเดต (03-11-2016): นำคำนำหน้าผู้ให้บริการและข้อมูลโค้ดที่อัปเดตออก