নেটিবার্ড ES6 নীল বার্ডের চেয়ে ধীর এবং আরও মেমরি-নিবিড় প্রতিশ্রুতিবদ্ধ কেন?


195

ইন এই বেঞ্চমার্ক , স্যুট Bluebird প্রতিশ্রুতি তুলনায় ES6 প্রতিশ্রুতি দিয়ে সম্পন্ন করতে 4 বার বেশী সময় লাগে, এবং আরো অনেক স্মৃতি যেমন 3.6 বার ব্যবহার করে।

কোনও জাভাস্ক্রিপ্ট লাইব্রেরি কীভাবে সি-তে লেখা ভি 8 এর নেটিভ প্রয়োগের চেয়ে এত দ্রুত এবং হালকা হতে পারে? ব্লুবার্ড প্রতিশ্রুতিগুলিতে নেটিভ ইএস 6 প্রতিশ্রুতির (একইসাথে অতিরিক্ত ইউটিলিটি পদ্ধতিগুলির একগুচ্ছ) ঠিক একই API থাকে।

নেটিভ বাস্তবায়ন কি খুব খারাপভাবে লেখা হয়েছে, বা এর কোনও অন্য দিক আছে যা আমি মিস করছি?


মনে রাখবেন যে আধুনিক জাভাস্ক্রিপ্ট বাস্তবায়নগুলি ব্যাপকভাবে অনুকূলিত হয়েছে, এবং এমনকি জেআইটি ব্যবহার করে স্থানীয়ভাবে চালাতে পারে ।

1
এই বেঞ্চমার্ক অনুসারে , ব্লুবার্ডজেএস প্রকৃত প্রতিশ্রুতিগুলির তুলনায় ধীর। তবে, প্রতিশ্রুতিস্পিজেজেএস আসলে তাদের উভয়কেই ছাড়িয়ে গেছে। PromiseMeSpeedJS এর ​​মাধ্যমে প্রমাণিত হওয়া অনেকগুলি জিনিসগুলির মধ্যে একটি হ'ল প্রতিশ্রুতিগুলির জন্য একটি বৃহত কার্য সম্পাদনের অপরাধী হ'ল newঅপারেটরের অপব্যবহারের অতিরিক্ত ব্যবহার কারণ প্রোমিসমেসপিডজেএস ব্যবহার করে না new
জ্যাক গিফিন

1
@ জ্যাকগিফিন ক্রোম 67: প্রতিশ্রুতিস্পিপিজেএস 46% ধীর এবং ব্লুবার্ড 61% ধীর।
ফিন্ডার্কসাইড

উত্তর:


272

ব্লুবার্ড লেখক এখানে।

ভি 8 প্রতিশ্রুতি বাস্তবায়ন জাভাস্ক্রিপ্টে লিখিত হয়েছে সি নয়, সমস্ত জাভাস্ক্রিপ্ট (ভি 8 এর নিজস্ব সহ) নেটিভ কোডে সংকলিত। নেতিবাচক কোডে সংকলনের আগে অতিরিক্তভাবে জাভাস্ক্রিপ্টের লিখিত ব্যবহারকারী অনুকূলিতকরণ করা হয় (যদি সম্ভব হয় (এবং এটির জন্য মূল্যবান))। প্রতিশ্রুতিবদ্ধ বাস্তবায়ন এমন কিছু যা সি তে লিখিত হওয়া থেকে খুব বেশি বা কোনও উপকারে আসবে না, বাস্তবে এটি কেবল এটি ধীর করে দেবে কারণ আপনি যা করছেন তা জাভাস্ক্রিপ্ট অবজেক্ট এবং যোগাযোগকে ম্যানিপুলেট করছে।

ভি 8 বাস্তবায়ন কেবল ব্লুবার্ডের মতো অপটিমাইজড নয়, উদাহরণের জন্য এটি প্রতিশ্রুতির হ্যান্ডলারের জন্য অ্যারে বরাদ্দ করে । প্রতিটি প্রতিশ্রুতিতেও বেশ কয়েকটি অ্যারে বরাদ্দ করতে হয় যখন এটি প্রচুর স্মৃতি গ্রহণ করে (বেঞ্চমার্ক সামগ্রিক 80 কে প্রতিশ্রুতি তৈরি করে যাতে 160 কে অব্যবহৃত অ্যারে বরাদ্দ করা হয়)। বাস্তবে 99.99% ব্যবহারের ক্ষেত্রে কখনও প্রতিশ্রুতি হয় না তাই এই সাধারণ ক্ষেত্রে অপরিহার্যতা অর্জন করে বিশাল মেমরি ব্যবহারের উন্নতি লাভ করে।

এমনকি ভি 8 ব্লুবার্ডের মতো একই অপটিমাইজেশন বাস্তবায়ন করলেও এটি নির্দিষ্টকরণের দ্বারা বাধা হয়ে দাঁড়াবে। new Promiseইএস 6-তে কোনও মূল প্রতিশ্রুতি তৈরির উপায় নেই বলে বেঞ্চমার্ককে (ব্লুবার্ডে একটি অ্যান্টি-প্যাটার্ন) ব্যবহার করতে হবে । new Promiseপ্রতিশ্রুতি তৈরির একটি অত্যন্ত ধীর পথ, প্রথমে এক্সিকিউটার ফাংশন একটি বন্ধের বরাদ্দ দেয়, দ্বিতীয়ত এটি আর্গুমেন্ট হিসাবে 2 পৃথক ক্লোজার পাস হয়। প্রতিশ্রুতি অনুযায়ী বরাদ্দকৃত এটি 3 টি ক্লোজার তবে একটি বন্ধ ইতিমধ্যে অনুকূলিত প্রতিশ্রুতির চেয়ে আরও ব্যয়বহুল অবজেক্ট।

ব্লুবার্ড এমনটি ব্যবহার করতে পারে promisifyযা প্রচুর অপ্টিমাইজেশানকে সক্ষম করে এবং কলব্যাক এপিআই গ্রহণের একাধিক সুবিধাজনক উপায় এবং এটি পুরো মডিউলগুলির প্রতিশ্রুতি ভিত্তিক মডিউলগুলিকে এক লাইনে রূপান্তর করতে সক্ষম করে ( promisifyAll(require('redis'));)।


10
"এখনও নির্দিষ্টকরণের দ্বারা বাধা থাকুন" - এর অর্থ কী তা নিশ্চিত নয়। আপনি কি বলছেন যে ES6 এমন একটি অনুমান অনুসরণ করছে যা সহজাতভাবে ধীর হয়, এবং যদি এরকম হয়, তার মানে কি ব্লুবার্ড একই অনুমানটিকে অনুসরণ করছে না (এবং যদি এটি হয় তবে এটি কি অন্যটি অনুসরণ করছে, এবং কোনটি)? এবং ইসএস এর আরও new Promiseকম মূল্যের ব্যয় করার জন্য ইনস্ট্যান্টেশনটি উন্নত করা বা ইনস্ট্যান্টেশনটি উন্নত করতে পারে না (উদাহরণস্বরূপ 3 টি ক্লোজার তৈরি করা নয়) এর কোনও কারণ আছে কি?
অ্যান্টনি

12
এটি মোটেও ভাল লাগছে না (জেএসের জন্য)। অভ্যন্তরীণ বাস্তবায়ন যখন হয় তখন আমি সত্যিই কোনও প্রতিশ্রুতি পাঠাগার ব্যবহার করতে চাই না। এটি যদি সত্য হয় তবে সবার দুর্ভাগ্যজনক পরিস্থিতি। তবে ইতিমধ্যে যেভাবেই প্রতিশ্রুতি-হাইপ দেখতে আমার সমস্যা হয়েছে, আমি 100,000 এলওসি জেএস অ্যাপ্লিকেশন লিখেছি এবং এখনও আমি এর কোনও বাস্তব প্রয়োজন দেখতে পাচ্ছি না, এটি যদি আমার কাছে বেশিরভাগ ক্ষেত্রে ত্রুটি পরিচালনার ক্ষেত্রে না হয় তবে এটি খুব সামান্য উন্নতি no কলব্যাক হ্যান্ডলিংয়ের উন্নতি (আমি আমার কোডিং শৈলীর সাথে কখনই "কলব্যাক হেল্প" এ ছিলাম না)।
মারে

19
ES6 এ, আপনি কি Promise.resolve()"মূল প্রতিশ্রুতি" তৈরি করতে ব্যবহার করতে পারবেন না ?
জেটলেন

10
@ মেরেরনোশাইন (অব্যাহত) বছর পরে, ES6 লেখকরা এসে বললেন "আরে, আসুন নির্দিষ্ট করে দিন যে জেএস ইঞ্জিনগুলি অবশ্যই একটি জেনেরিক প্রতিশ্রুতি / এ + বাক্সের বাইরে থাকা ইউটিলিটি সরবরাহ করবে, যাতে লোকেরা সবসময় হস্তান্তর করার জন্য একটি মৌলিক প্রতিশ্রুতি সরঞ্জাম রাখে "। এটি একটি দুর্দান্ত সুবিধা (কেবলমাত্র দ্রুত Promise.resolve()বা যা কিছু করার জন্য একটি গ্রন্থাগারটি আমদানি না করা), তবে এটি একটি খুব বেসিক বাস্তবায়ন এবং এর অস্তিত্বটি আপনাকে ব্লুবার্ডের মতো আরও গুরুতর প্রতিশ্রুতি-সম্পর্কিত সরঞ্জামগুলি ব্যবহার করা থেকে বিরত রাখতে পারে না!
কলম

11
@ মাররেনোশাইন 100 কে এলওসি জাভাস্ক্রিপ্ট অ্যাপ্লিকেশনটিতে সম্ভবত কোনও অ্যাসিঙ্ক কার্যকারিতা ছিল না। শুভকামনা ব্লুবার্ড ছাড়াই মাইএসকিএল / রেডিস লাইব্রেরি সহ 100 কিলোর্ধ্বতন এলওসি জেএস গেমটি লেখার জন্য।
নিকক নিউম্যান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.