স্থানান্তরযোগ্য বস্তু - বাজ দ্রুত

Chrome 13 স্ট্রাকচার্ড ক্লোনিং নামক একটি অ্যালগরিদম ব্যবহার করে ওয়েব ওয়ার্কারকে ArrayBuffer s পাঠানোর প্রচলন করেছে। এটি postMessage() API-কে শুধুমাত্র স্ট্রিং নয়, File , Blob , ArrayBuffer , এবং JSON অবজেক্টের মতো জটিল ধরনের বার্তা গ্রহণ করার অনুমতি দেয়৷ ফায়ারফক্সের পরবর্তী সংস্করণেও স্ট্রাকচার্ড ক্লোনিং সমর্থিত।

দ্রুততর ভাল

স্ট্রাকচার্ড ক্লোনিং দুর্দান্ত, তবে এটি এখনও একটি অনুলিপি অপারেশন। একজন কর্মীকে 32MB ArrayBuffer পাস করার ওভারহেড শত শত মিলিসেকেন্ড হতে পারে। ব্রাউজারগুলির নতুন সংস্করণে বার্তা প্রেরণের জন্য একটি বিশাল কর্মক্ষমতা উন্নতি রয়েছে, যাকে স্থানান্তরযোগ্য বস্তু বলা হয়।

স্থানান্তরযোগ্য বস্তুর সাথে, ডেটা এক প্রসঙ্গ থেকে অন্য প্রসঙ্গে স্থানান্তরিত হয়। এটি শূন্য-কপি, যা একজন কর্মীকে ডেটা পাঠানোর কার্যকারিতাকে ব্যাপকভাবে উন্নত করে। আপনি যদি C/C++ বিশ্বের হয়ে থাকেন তাহলে এটিকে পাস-বাই-রেফারেন্স হিসেবে ভাবুন। যাইহোক, পাস-বাই-রেফারেন্সের বিপরীতে, কলিং প্রসঙ্গ থেকে 'সংস্করণ' নতুন প্রসঙ্গে স্থানান্তরিত হয়ে গেলে আর পাওয়া যায় না। উদাহরণস্বরূপ, আপনার প্রধান অ্যাপ থেকে Worker-এ একটি ArrayBuffer স্থানান্তর করার সময়, আসল ArrayBuffer সাফ হয়ে যায় এবং আর ব্যবহারযোগ্য নয়। এর বিষয়বস্তু (শান্ত আক্ষরিক) কর্মী প্রসঙ্গে স্থানান্তরিত হয়।

স্থানান্তরযোগ্যদের সাথে খেলতে, postMessage() এর একটি নতুন সংস্করণ রয়েছে যা স্থানান্তরযোগ্য বস্তুগুলিকে সমর্থন করে:

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

কর্মীর ক্ষেত্রে, প্রথম যুক্তি হল ArrayBuffer বার্তা। দ্বিতীয় যুক্তি হল আইটেমগুলির একটি তালিকা যা স্থানান্তর করা উচিত। এই উদাহরণে, আপনি স্থানান্তরযোগ্য তালিকায় arrayBuffer নির্দিষ্ট করতে চান।

বেঞ্চমার্ক ডেমো

হস্তান্তরযোগ্যদের কর্মক্ষমতা লাভ দেখতে, আমি একটি ডেমো একসাথে রেখেছি।

ডেমো একটি 32MB ArrayBuffer একজন কর্মীকে পাঠায় এবং postMessage() ব্যবহার করে ফিরে আসে। যদি আপনার ব্রাউজার হস্তান্তরযোগ্য সমর্থন না করে, তাহলে নমুনাটি স্ট্রাকচার্ড ক্লোনিংয়ে ফিরে আসে। বিভিন্ন ব্রাউজারে গড়ে 5 রান, আমি যা পেয়েছি তা এখানে:

স্ট্রাকচার্ড ক্লোনিং বনাম হস্তান্তরযোগ্য বস্তুর তুলনা চার্ট

একটি MacBook Pro/10.6.8/2.53 GHz/Intel Core 2 Duo-এ, FF ছিল স্ট্রাকচার্ড ক্লোনিং ব্যবহার করে দ্রুততম। গড়ে, একজন কর্মীকে 32MB ArrayBuffer পাঠাতে এবং এটিকে মূল থ্রেডে (RRT - রাউন্ড ট্রিপ টাইম) পোস্ট করতে 302ms লেগেছে। স্থানান্তরযোগ্যদের সাথে তুলনা করে, একই পরীক্ষায় 6.6ms লেগেছিল। এটি একটি বিশাল পারফ বুস্ট!

এই ধরনের গতি থাকার ফলে বিশাল 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+

আপডেট করা হয়েছে (2011-12-13): webkitPostMessage() স্বাক্ষর দেখানোর জন্য কোড স্নিপেট উইন্ডো এবং কর্মীর জন্য আলাদা। আপডেট করা হয়েছে (2016-11-03): সরানো হয়েছে বিক্রেতা উপসর্গ এবং আপডেট করা কোড স্নিপেট