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): นำคำนำหน้าผู้ให้บริการและข้อมูลโค้ดที่อัปเดตออก