যেমন অন্যান্য উত্তর হিসাবে উল্লিখিত হয়েছে, প্রতিশ্রুতিটি সরাসরি ফেরত দিয়ে বুদবুদ দেওয়ার সময় সামান্য পারফরম্যান্সের সুবিধা থাকতে পারে - কেবল কারণ আপনাকে প্রথমে ফলাফলটির জন্য অপেক্ষা করতে হবে না এবং তারপরে আবার অন্য প্রতিশ্রুতি দিয়ে এটি মোড়ানো হবে। তবে কেউ এখনও টেল কল অপটিমাইজেশন সম্পর্কে কথা বলেনি ।
টেইল কল অপ্টিমাইজেশন , বা "যথাযথ লেজ কল" , এমন একটি কৌশল যা দোভাষী তার কল স্ট্যাকটি অনুকূল করতে ব্যবহার করে। বর্তমানে, বেশিরভাগ রানটাইম এখনও এটিকে সমর্থন করে না - যদিও এটি প্রযুক্তিগতভাবে ES6 স্ট্যান্ডার্ডের অংশ - তবে ভবিষ্যতে এটির সমর্থন যোগ হতে পারে, সুতরাং আপনি ভাল কোডটি লিখে বর্তমানের জন্য প্রস্তুত করতে পারেন।
সংক্ষেপে, টিসিও (বা পিটিসি) সরাসরি কোনও ফাংশন দ্বারা ফিরে আসা কোনও ফাংশনের জন্য একটি নতুন ফ্রেম না খোলার মাধ্যমে কল স্ট্যাকটিকে অনুকূল করে । পরিবর্তে, এটি একই ফ্রেমটিকে পুনরায় ব্যবহার করে।
async function delay1Second() {
return delay(1000);
}
যেহেতু delay()
সরাসরি delay1Second()
পাঠানো হয়েছে , পিটিসি সমর্থনকারী রানটাইমগুলি প্রথমে delay1Second()
(বাইরের ফাংশন) জন্য একটি ফ্রেম খুলবে , তবে তারপরে (অভ্যন্তরীণ ফাংশন) জন্য অন্য ফ্রেমটি খোলার পরিবর্তে delay()
এটি কেবল একই ফ্রেমটি পুনরায় ব্যবহার করবে যা বাইরের ফাংশনের জন্য খোলা হয়েছিল। এটি স্ট্যাকটিকে সর্বোত্তম করে তোলে কারণ এটি খুব বড় পুনরাবৃত্ত ক্রিয়াকলাপগুলির সাথে স্ট্যাকের ওভারফ্লো (hehe) প্রতিরোধ করতে পারে , যেমন fibonacci(5e+25)
,। মূলত এটি একটি লুপ হয়ে যায়, যা অনেক দ্রুত।
অভ্যন্তরীণ ফাংশনটি সরাসরি ফিরে আসলে পিটিসি সক্ষম হয় । ফাংশনটির ফলাফল ফিরে আসার আগে পরিবর্তিত হলে এটি ব্যবহার করা হয় না, উদাহরণস্বরূপ, যদি আপনার ছিল return (delay(1000) || null)
, বা return await delay(1000)
।
তবে আমি যেমন বলেছি, বেশিরভাগ রানটাইম এবং ব্রাউজারগুলি এখনও পিটিসি সমর্থন করে না, সুতরাং এটি সম্ভবত এখন বিশাল পার্থক্য করে না, তবে এটি আপনার কোডটিকে ভবিষ্যতের প্রুফের ক্ষতি করতে পারে না।
এই প্রশ্নে আরও পড়ুন: নোড.জেএস: অ্যাসিঙ্ক ফাংশনগুলিতে লেজ কলগুলির জন্য অপ্টিমাইজেশন রয়েছে?