পারফরম্যান্স: জাভাস্ক্রিপ্টে পুনরাবৃত্তি বনাম পুনরাবৃত্তি


24

আমি জাভাস্ক্রিপ্টের কার্যকরী দিকগুলি এবং স্কিম এবং জাভাস্ক্রিপ্টের মধ্যে সম্পর্কের সম্পর্কে সম্প্রতি কিছু নিবন্ধ (যেমন http://dailyjs.com/2012/09/14/functional-pramramming/ ) পড়েছি (দ্বিতীয়টি প্রথম দ্বারা প্রভাবিত হয়েছিল, যা একটি কার্যকরী ভাষা, যখন ওও দিকগুলি স্ব থেকে প্রাপ্ত হয় যা একটি প্রোটোটাইপিং-ভিত্তিক ভাষা)।

তবে আমার প্রশ্নটি আরও সুনির্দিষ্ট: আমি ভাবছিলাম যে জাভাস্ক্রিপ্টে পুনরাবৃত্তি বনাম পুনরাবৃত্তির পারফরম্যান্স সম্পর্কে মেট্রিক রয়েছে কিনা।

আমি জানি যে কয়েকটি ভাষায় (যেখানে নকশার পুনরাবৃত্তি আরও ভাল সম্পাদন করে) পার্থক্যটি ন্যূনতম কারণ দোভাষী / সংকলক পুনরাবৃত্তিটিকে পুনরাবৃত্তিতে রূপান্তরিত করে, তবে আমি অনুমান করি যে সম্ভবত এটি জাভাস্ক্রিপ্টের ক্ষেত্রে নয় কারণ এটি কমপক্ষে আংশিকভাবে একটি কার্যকরী ভাষা.


3
আপনার নিজের পরীক্ষা করুন এবং ঠিক এখনই jsperf.com-
তেহশ্রাইক

অনুগ্রহ এবং টিসিও উল্লেখ করে একটি উত্তর সহ। এটি ES6 টিসিও নির্দিষ্ট করে বলে মনে হয় তবে এখন পর্যন্ত কেউ এটি প্রয়োগ করে না যদি আমরা বিশ্বাস করি kangax.github.io/compat-table/es6 আমি কি কিছু হারিয়েছি?
ম্যাথিয়াস কাউয়ার

উত্তর:


28

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

পুনরাবৃত্তি কর্মক্ষমতা সম্ভবত পুনরাবৃত্তির পারফরম্যান্সের চেয়ে খারাপ, কারণ ফাংশন কল এবং রিটার্নগুলির জন্য রাষ্ট্র সংরক্ষণ এবং পুনরুদ্ধারের প্রয়োজন হয়, যখন পুনরাবৃত্তি কেবল কোনও ফাংশনের অন্য বিন্দুতে যায়।


কেবল অবাক হচ্ছি ... আমি কিছুটা কোড দেখেছি যেখানে খালি অ্যারে তৈরি করা হয় এবং পুনরাবৃত্ত ফাংশন সাইটটি অ্যারেতে একটি অবস্থানের জন্য বরাদ্দ করা হয় এবং তারপরে অ্যারেতে সঞ্চিত মানটি ফিরে আসে। "আপনার নিজের স্ট্যাক দিয়ে পুনরাবৃত্তিটি প্রতিস্থাপন করুন" বলতে আপনি কী বোঝাতে চাইছেন? যেমন: var stack = []; var factorial = function(n) { if(n === 0) { return 1 } else { stack[n-1] = n * factorial(n - 1); return stack[n-1]; } }
মাস্তাজি

@ মাস্তাজি: না, এটি অভ্যন্তরীণ সাথে একটি অকেজো কল স্ট্যাক করবে। আমি উইকিপিডিয়া থেকে কিউ-ভিত্তিক বন্যা পূরণের মতো কিছু বোঝাতে চাইছিলাম
ট্রায়ানগ

এটি লক্ষ্য করার মতো যে কোনও ভাষা টিসিও না করে তবে বাস্তবায়ন হতে পারে। জনগণ যেভাবে জেএসকে অনুকূল করে তুলেছে তার অর্থ সম্ভবত টিসিও কয়েকটি বাস্তবায়নে হাজির হতে পারে
ড্যানিয়েল গ্রেটজার

1
@ মস্তাজি elseসেই ফাংশনটির সাথে প্রতিস্থাপন করুন else if (stack[n-1]) { return stack[n-1]; } elseএবং আপনি স্মৃতিচারণ করেছেন । যে কেউ লিখেছেন যে ফ্যাক্টরিয়াল কোডটির একটি অসম্পূর্ণ বাস্তবায়ন ছিল (এবং সম্ভবত এর stack[n]পরিবর্তে সর্বত্র ব্যবহার করা উচিত ছিল stack[n-1])।
ইজকাটা

আপনাকে ধন্যবাদ ইজকাটা, আমি প্রায়শই এই জাতীয় অপটিমাইজেশন করি তবে আজ অবধি আমি এর নাম জানতাম না। আইটি ;-) এর পরিবর্তে আমার সিএস পড়া উচিত ছিল
মাস্তাজি

20

আপডেট : ES2015 সাল থেকে, জাভাস্ক্রিপ্টে টিসিও রয়েছে , সুতরাং নীচের যুক্তির অংশটি আর দাঁড়ায় না।


যদিও জাভাস্ক্রিপ্টে টেল কল অপ্টিমাইজেশন নেই, তবে পুনরাবৃত্তি প্রায়ই যাওয়ার সবচেয়ে ভাল উপায়। এবং আন্তরিকভাবে, প্রান্তের ক্ষেত্রেগুলি বাদে আপনি কল স্ট্যাকের ওভারফ্লো করতে যাচ্ছেন না।

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

পুনরাবৃত্তি সবসময় আরও মার্জিত হয় 1

1 : ব্যক্তিগত মতামত।


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

3
@ মাস্তাজি আমার উত্তরে যেমন বলেছিলেন, আমি সন্দেহ করি যে পুনরাবৃত্তি আপনার বাধা হয়ে উঠবে। বেশিরভাগ সময়, এটি ডোম কারসাজি, বা আরও সাধারণভাবে I / O। এবং ভুলে যাবেন না যে অকালীন অপটিমাইজেশন হ'ল সমস্ত
কুফলের

ডিওএম ম্যানিপুলেশনের জন্য +1 বেশিরভাগ সময় বাধা হয়ে দাঁড়ায়! আমি এ সম্পর্কে ইয়াহুদা কাটজ (এমবার.জেএস) এর একটি খুব আকর্ষণীয় সাক্ষাত্কারটি মনে করি।
মাস্তাজি

1
@ মাইক "অকাল" এর সংজ্ঞাটি "সঠিক সময়ের আগে পরিপক্ক বা পাকা"। যদি আপনি জানেন যে পুনরাবৃত্তভাবে কিছু করা একটি স্ট্যাকওভারফ্লোতে কারণ হিসাবে দেখা দেয় তবে তা অকাল নয়। যাইহোক, আপনি যদি কোনও ঝাঁকুনি ধরে থাকেন (কোনও প্রকৃত ডেটা ছাড়াই) তবে তা অকালকালীন।
জিরাক

2
জাভাস্ক্রিপ্টের সাহায্যে আপনি প্রোগ্রামটি কতটা স্ট্যাক পাবেন তা পাবেন না। আপনার কাছে আইআই 6 এর একটি ছোট স্ট্যাক বা ফায়ার ফক্সে একটি বড় স্ট্যাক থাকতে পারে। আপনার স্কিম-স্টাইলের পুনরাবৃত্ত লুপটি করা না হলে পুনরাবৃত্তির অ্যালগরিদমের খুব কমই স্থির গভীরতা থাকে। এটি কেবল মনে হচ্ছে না যে অ-লুপ ভিত্তিক পুনরাবৃত্তি অকালীন অপটিমাইজেশন এড়ানোর জন্য ফিট করে।
মাইকে 30

7

আমি জাভাস্ক্রিপ্টেও এই অভিনয়টি সম্পর্কে বেশ কৌতূহল ছিলাম, তাই আমি কিছু পরীক্ষা-নিরীক্ষাও করেছি (নোডের পুরানো সংস্করণে হলেও)। আমি একটি ফ্যাক্টরিয়াল ক্যালকুলেটরটি পুনরাবৃত্তভাবে বনাম পুনরাবৃত্তিগুলি লিখেছি এবং এটি স্থানীয়ভাবে কয়েকবার চালিয়েছি। ফলাফলটি বেশ ভারীভাবে করের (প্রত্যাশিত) পুনরাবৃত্তির দিকে ঝুঁকছে ske

কোড: https://github.com/j03m/trickyQuestions/blob/master/factorial.js

Result:
j03m-MacBook-Air:trickyQuestions j03m$ node factorial.js 
Time:557
Time:126
j03m-MacBook-Air:trickyQuestions j03m$ node factorial.js 
Time:519
Time:120
j03m-MacBook-Air:trickyQuestions j03m$ node factorial.js 
Time:541
Time:123
j03m-MacBook-Air:trickyQuestions j03m$ node --version
v0.8.22

আপনি এটি দিয়ে চেষ্টা করতে "use strict";পারেন এবং দেখুন এটি কোনও পার্থক্য করে কিনা। (এটি jumpস্ট্যান্ডার্ড কল সিকোয়েন্সের পরিবর্তে গুলি তৈরি করবে )
বার্ডক

1
নোডের একটি সাম্প্রতিক সংস্করণে (6.9.1) আমি অত্যন্ত অনুরূপ ফলাফল পেয়েছি। পুনরাবৃত্তিতে করের একটি বিট আছে, তবে আমি এটিকে একটি প্রান্তের বিষয় হিসাবে বিবেচনা করি - লুপ প্রতি 10,000,000 লুপের 400ms পার্থক্য 00 আপনি যদি 1,000,000 লুপগুলি করেন তবে এটি মনে রাখা উচিত is
কেলজ

6

অনুযায়ী ওপি অনুরোধে আমি (নিজেকে বোকা না করে, আশা করছি: P) বসাতে হবে

আমি মনে করি আমরা সকলেই একমত হয়েছি যে পুনরাবৃত্তি কোডিংয়ের আরও একটি মার্জিত উপায়। যদি ভালভাবে সম্পন্ন করা হয় তবে এটি আরও রক্ষণাবেক্ষণযোগ্য কোডের জন্য তৈরি করতে পারে, যা আইএমএইচও ঠিক যতটা গুরুত্বপূর্ণ (যদি না হয় তবে) এটি 0.0001 মিমি শেভ করে।

যতদূর জেএস টেল-কল অপ্টিমাইজেশন সম্পাদন করে না এমন যুক্তিটি সম্পর্কিত: এটি পুরোপুরি সত্য নয়, ইসিএমএ 5 এর কঠোর মোড ব্যবহার করে টিসিও সক্ষম করে। এটি এমন কিছু ছিল যা আমি কিছুক্ষণ আগে খুব বেশি খুশি ছিলাম না, তবে কমপক্ষে আমি এখন জানি কেন arguments.calleeকঠোর মোডে ত্রুটিগুলি ছুঁড়ে ফেলে। আমি একটি বাগ রিপোর্টের উপরের লিঙ্কগুলি জানি, তবে বাগটি ডাব্লুউন্টিক্সে সেট করা আছে। এছাড়াও, স্ট্যান্ডার্ড টিসিও আসছে: ইসিএমএ 6 (ডিসেম্বর 2013)।

সহজাতভাবে, এবং জেএসের কার্যকরী প্রকৃতির সাথে লেগে থাকা, আমি বলব যে পুনরাবৃত্তিটি সময়ের 99.99% সময়ের চেয়ে আরও কার্যকর কোডিং শৈলী। যাইহোক, ফ্লোরিয়ান মারগেইনের একটি বক্তব্য রয়েছে যখন তিনি বলেছিলেন যে বাধাটি অন্য কোথাও পাওয়া যাবে। আপনি যদি ডিওএম চালনা করছেন তবে আপনি সম্ভবত আপনার কোডটি যথাসম্ভব রক্ষণাবেক্ষণযোগ্য হিসাবে লেখার দিকে মনোযোগ দিচ্ছেন। DOM এপিআই এটি হ'ল: ধীর।

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

সংক্ষেপে: আমি বলব কোন কৌশলটি আরও পারফরম্যান্ট হবে তা জেএসের মতো বরাবরই অনুমান করা অসম্ভব।


3

কঠোর মোড ব্যতীত, আইট্রেশন পারফরম্যান্স সাধারণত কিছুটা দ্রুত হয় পুনরাবৃত্তি ( জেআইটি আরও কাজ করার পাশাপাশি )। টেল পুনরাবৃত্তি অপ্টিমাইজেশন মূলত যে কোনও লক্ষণীয় পার্থক্য দূর করে কারণ এটি পুরো কল ক্রমটিকে একটি জাম্পে পরিণত করে।

উদাহরণ: জাস্পফারফ

পুনরাবৃত্তি এবং পুনরাবৃত্তির মধ্যে নির্বাচন করার ক্ষেত্রে কোডের স্বচ্ছতা এবং সরলতার বিষয়ে আমি আরও অনেক চিন্তা করার পরামর্শ দেব।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.