লুপগুলি কি বিপরীতে সত্যিই দ্রুত হয়?


268

আমি বেশ কয়েকবার শুনেছি। পিছনে গণনা করার সময় জাভাস্ক্রিপ্ট লুপগুলি কি খুব দ্রুত হয়? যদি তাই হয় তবে কেন? আমি কয়েকটি পরীক্ষার স্যুট উদাহরণ দেখেছি যা দেখিয়েছে যে বিপরীত লুপগুলি দ্রুত হয়, তবে কেন আমি তার কোনও ব্যাখ্যা পাই না!

আমি এটি ধরে নিচ্ছি কারণ লুপটির প্রতিবার কোনও সম্পত্তি এটি শেষ হয়েছে কিনা তা যাচাই করে দেখার জন্য আর তার মূল্যায়ন করতে হবে না এবং এটি কেবল চূড়ান্ত সংখ্যাসূচক মানের তুলনায় পরীক্ষা করে।

অর্থাত

for (var i = count - 1; i >= 0; i--)
{
  // count is only evaluated once and then the comparison is always on 0.
}

6
Hehe। এটি অনির্দিষ্টকালের জন্য গ্রহণ করবে। i-- চেষ্টা করুন
স্ট্যাম্পেডএক্সভি

5
পিছনের forলুপটি দ্রুত হয় কারণ উপরের-আবদ্ধ (হি, নিম্ন-সীমাবদ্ধ) লুপ নিয়ন্ত্রণ ভেরিয়েবলটি কোনও বস্তু থেকে সংজ্ঞায়িত করতে বা আনতে হয় না; এটি একটি ধ্রুব শূন্য।
জোশ স্টোডোলা

88
নেই কোনো সত্যিকারের পার্থক্য । নেটিভ লুপ নির্মাণগুলি সর্বদা খুব দ্রুত হতে চলেছে । তাদের অভিনয় সম্পর্কে চিন্তা করবেন না।
জেমস এলার্ডিস

24
@ আফশিন: এই জাতীয় প্রশ্নের জন্য দয়া করে আপনার উল্লেখ করা নিবন্ধগুলি দেখান
অরবিটে

22
খুব নিম্ন-প্রান্ত এবং ব্যাটারি চালিত ডিভাইসের জন্য মূলত পার্থক্য রয়েছে। পার্থক্যটি হ'ল i- এর সাথে আপনি লুপের শেষের জন্য 0 এর সাথে তুলনা করুন, I ++ এর সাথে আপনি সংখ্যার সাথে> 0 টি তুলনা করুন I , বিএক্স) - যা কিছুই নয় তবে আপনি যদি প্রতি সেকেন্ডে কয়েক হাজার বার লুপ করেন তবে কেন প্রতিটি ন্যানোসেকেন্ডের জন্য 20 টি লাভ নেই :)
লুবেন

উত্তর:


902

এটি এর i--চেয়ে দ্রুততর নয় i++। আসলে, তারা উভয়ই সমান দ্রুত।

আরোহী লুপগুলিতে কী সময় নেয় তা মূল্যায়ণ করে প্রতিটি iজন্য আপনার অ্যারের আকার the এই লুপে:

for(var i = array.length; i--;)

আপনি .lengthযখন ঘোষণা করেন তখনই আপনি একবার মূল্যায়ন করেন , যখন iএই লুপের জন্য

for(var i = 1; i <= array.length; i++)

আপনি যখন .lengthপ্রতিবার ইনক্রিমেন্ট করেন তা মূল্যায়ন করেন i, আপনি যখন পরীক্ষা করেন কিনা i <= array.length

বেশিরভাগ ক্ষেত্রে আপনার এই ধরণের অপ্টিমাইজেশন সম্পর্কে চিন্তা করা উচিত নয়


23
অ্যারে. দৈর্ঘ্যের জন্য একটি পরিবর্তনশীল প্রবর্তন করা এবং লুপের মাথার জন্য এটি ব্যবহার করা কি উপযুক্ত?
ragatskynet

39
@ আরগাটসকেনেট: না, যদি না আপনি একটি মানদণ্ড স্থাপন করেন এবং কোনও বক্তব্য রাখতে চান না।
জন

29
@ আরগাটস্কাইনেট এটি নির্ভর করে: .lengthএকটি নির্দিষ্ট সংখ্যক বার মূল্যায়ন করা বা নতুন ভেরিয়েবল ঘোষণা ও সংজ্ঞা দেওয়া কি দ্রুত হবে ? বেশিরভাগ ক্ষেত্রে, এটি অকাল (এবং ভুল) অপটিমাইজেশন, যদি না আপনার lengthমূল্যায়ন করা খুব ব্যয় হয়।
আলেস্তানিস

10
@ ডাঃড্রেডেল: এটি তুলনা নয় - এটি মূল্যায়ন। 0তুলনায় মূল্যায়ন দ্রুত array.length। ভাল, অনুমান।
অরবিটে হালকা ঘোড়দৌড়

22
উল্লেখ করার মতো বিষয় হ'ল আমরা রুবি, পাইথনের মতো বর্ণিত ভাষা সম্পর্কে কথা বলছি। সংকলিত ভাষাগুলি যেমন জাভা সংকলক স্তরে অপ্টিমাইজেশন রয়েছে যা এই পার্থক্যগুলিকে "মসৃণ" করবে যে এটি .lengthঘোষণায় আছে for loopবা না তা বিবেচনাধীন নয়।
হারিস ক্রাজিনা

198

এই লোকটি অনেকগুলি ব্রাউজারে জাভাস্ক্রিপ্টে প্রচুর লুপ তুলনা করেছে। তার একটি পরীক্ষার স্যুট রয়েছে যাতে আপনি সেগুলি নিজে চালাতে পারেন।

সব ক্ষেত্রে (আমি আমার পড়াটিতে একটি মিস না করে) দ্রুততম লুপটি ছিল:

var i = arr.length; //or 10
while(i--)
{
  //...
}

চমৎকার :) তবে "লুপ পরীক্ষিত" এর জন্য কোনও পশ্চাদপদ নেই ... তবে পেরিরিক্স বা সন্ধানিলে উল্লিখিত লুপগুলির অবস্থা "আই--" সহ "লুপ" এর মতোই হওয়া উচিত। এবং এটি ছিল দ্রুততম লুপটি পরীক্ষা করা।
সোভেনফিনকে

11
আকর্ষণীয়, তবে আমি ভাবছি যে প্রাক-হ্রাস আরও দ্রুততর হবে কিনা। যেহেতু এটির মধ্যবর্তী মান সংরক্ষণ করতে হবে না।
tvanfosson

আমি যদি সঠিকভাবে মনে রাখি তবে আমার হার্ডওয়্যার-কোর্স প্রফেসর বলেছেন, 0 বা 0 এর জন্য পরীক্ষাটি সবচেয়ে দ্রুত সম্ভব "গণনা" নয়। কিছুক্ষণের মধ্যে (i--) পরীক্ষা সর্বদা 0 এর জন্য পরীক্ষা is সম্ভবত এই কারণেই এটি সবচেয়ে দ্রুত?
স্ট্যাম্পেডএক্সভি

3
@ ট্যানভাফসন যদি আপনি প্রাক হ্রাস করে থাকেন --iতবে আপনাকে var current = arr[i-1];লুপের ভিতরে ব্যবহার করতে হবে বা এটি একের পর এক বন্ধ হয়ে যাবে ...
ডেভএলগার

2
আমি শুনেছি - ii --i এর চেয়ে দ্রুততর হতে পারে কারণ দ্বিতীয় ক্ষেত্রে প্রসেসরের হ্রাস হওয়া দরকার এবং তারপরে নতুন মানটির বিরুদ্ধে পরীক্ষা করা প্রয়োজন (নির্দেশাবলীর মধ্যে একটি ডেটা নির্ভরতা রয়েছে), যখন প্রথম ক্ষেত্রে প্রসেসর করতে পারে বিদ্যমান মানটি পরীক্ষা করুন এবং কিছু সময় পরে মান হ্রাস করুন। আমি নিশ্চিত নই যে এটি জাভাস্ক্রিপ্ট বা কেবলমাত্র খুব নিম্ন-স্তরের সি কোডে প্রযোজ্য কিনা।
মার্কাস

128

আমি এই উত্তর দিয়ে একটি বিস্তৃত ছবি দেওয়ার চেষ্টা করি।

আমি সম্প্রতি ইস্যুটি পরীক্ষা না করা পর্যন্ত বন্ধনীগুলিতে নিম্নলিখিত চিন্তাভাবনাগুলি আমার বিশ্বাস ছিল :

[[ সি / সি ++ এর মতো নিম্ন স্তরের ভাষার ক্ষেত্রে , কোডটি সংকলিত হয় যাতে প্রসেসরের একটি বিশেষ শর্তযুক্ত জাম্প কমান্ড থাকে যখন ভেরিয়েবল শূন্য হয় (বা শূন্য নয়)। এছাড়াও, আপনি যদি এই অত্যধিক অপ্টিমাইজেশানটির বিষয়ে চিন্তা করেন তবে আপনি তার পরিবর্তে যেতে পারেন , কারণ একক প্রসেসর কমান্ড যেখানে এর অর্থ ]]
++ii++++ii++j=i+1, i=j

সত্যিই দ্রুত লুপগুলি এটিকে তালিকাভুক্ত না করে করা যেতে পারে:

for(i=800000;i>0;--i)
    do_it(i);

এটি চেয়ে ধীর হতে পারে

for(i=800000;i>0;i-=8)
{
    do_it(i); do_it(i-1); do_it(i-2); ... do_it(i-7);
}

তবে এর কারণগুলি বেশ জটিল হতে পারে (কেবল উল্লেখ করার জন্য, গেমটিতে প্রসেসর কমান্ড প্রিপ্রসেসিং এবং ক্যাশে হ্যান্ডলিংয়ের বিষয়গুলি রয়েছে)।

নিরিখে উচ্চ স্তরের ভাষা , মত জাভাস্ক্রিপ্ট হিসাবে আপনি জিজ্ঞেস করলেন, কিছু লুপিং জন্য অপ্টিমাইজ পারেন যদি আপনি লাইব্রেরি উপর নির্ভর ফাংশন বিল্ট-ইন। এটি কীভাবে সেরা হয় তা তাদের সিদ্ধান্ত নিতে দিন।

ফলস্বরূপ, জাভাস্ক্রিপ্টে, আমি এরকম কিছু ব্যবহার করার পরামর্শ দেব

array.forEach(function(i) {
    do_it(i);
});

এটি ত্রুটি-প্রবণতাও কম এবং ব্রাউজারগুলির কাছে আপনার কোডটি অপ্টিমাইজ করার সুযোগ রয়েছে।

[মন্তব্য: কেবল ব্রাউজারগুলি নয়, আপনার খুব সহজেই অনুকূলিতকরণের জন্য একটি জায়গা রয়েছে, কেবলমাত্র forEachফাংশনটিকে ( নতুনভাবে নির্ভর করে ব্রাউজারটি) নতুন করে সংজ্ঞা দিন যাতে এটি সর্বশেষতম সেরা কৌশল ব্যবহার করে! :) @AMK বিশেষ ক্ষেত্রে বলছেন বরং এটা ব্যবহার মূল্য array.popবা array.shift। যদি আপনি এটি করেন, এটি পর্দার পিছনে রাখুন। পরম Overkill অপশন যোগ করার জন্য হয় forEachলুপিং অ্যালগরিদম নির্বাচন করতে।]

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

এই লাইব্রেরিগুলি আপনার পিছনে জিনিসগুলি (বহু-থ্রেডযুক্ত) রাখতে পারে এবং বিশেষায়িত প্রোগ্রামাররা সেগুলি আপ টু ডেট রাখে।

আমি কিছুটা বেশি যাচাই-বাছাই করে দেখলাম যে সি / সি ++ এর মধ্যে, এমনকি 5e9 = (50,000x100,000) অপারেশনের জন্যও, যদি @ এলিস্তানিসের মত ধ্রুবকের বিরুদ্ধে পরীক্ষা করা হয় তবে উপরে ও নীচে কোনও পার্থক্য নেই । (JsPerf ফলাফল কখনও কখনও অসঙ্গত কিন্তু মোটের উপর বলতে একই: আপনি একটি বড় পার্থক্য করতে পারবে না)।
সুতরাং --iবরং একটি "সর্বোকৃষ্ট" ব্যাপার হতে হবে। এটি কেবল আপনাকে আরও ভাল প্রোগ্রামারের মতো দেখায়। :)

অন্যদিকে, এই 5e9 পরিস্থিতিতে অ-তালিকাভুক্তকরণের জন্য, আমি যখন 10 সেকেন্ডে গিয়েছিলাম তখন তা আমাকে 12 সেকেন্ড থেকে 2.5 সেকেন্ডে নামিয়ে নিয়েছে এবং আমি যখন 20 এর দশক পেরিয়েছি তখন 2.1 সেকেন্ডে চলে এসেছি। এটি অপ্টিমাইজেশান ছাড়াই ছিল এবং অপ্টিমাইজেশন জিনিসগুলি অমূল্য অল্প সময়ের জন্য এনেছে। :) (তালিকাভুক্তি উপরে বা ব্যবহার করে আমার পদ্ধতিতে করা যেতে পারে i++তবে জাভাস্ক্রিপ্টে জিনিসগুলি সামনে আনা যায় না))

সর্বেসর্বা: Keep i--/ i++এবং ++i/ i++কাজ সাক্ষাতকার, বিদ্ধ করা পার্থক্য array.forEachবা অন্যান্য জটিল গ্রন্থাগার ফাংশন যখন পাওয়া যায়। ;)


18
মূল শব্দটি "হতে পারে"। আপনার নিবন্ধভুক্ত লুপটি মূলের থেকেও ধীর হতে পারে। অনুকূলকরণ করার সময়, সর্বদা পরিমাপ করুন যাতে আপনার পরিবর্তনগুলি ঠিক কীভাবে প্রভাব ফেলেছিল তা আপনি জানেন।
jalf

1
@ জালফ সত্যই, +1। দক্ষতার দিক থেকে আলাদা আলাদা অপরিবর্তিত দৈর্ঘ্য (> = 1) আলাদা। এ কারণেই যদি সম্ভব হয় তবে এই কাজটি লাইব্রেরিতে ছেড়ে দেওয়া আরও সুবিধাজনক, ব্রাউজারগুলি বিভিন্ন আর্কিটেকচারে চালিত হয় তা উল্লেখ না করে তারা কীভাবে সিদ্ধান্ত নেওয়ার সিদ্ধান্ত নিলে আরও ভাল হতে পারে array.each(...)। আমি মনে করি না তারা চেষ্টা করবে এবং লুপের জন্য উন্মুক্ত প্লেইন নিয়ে পরীক্ষা করবে।
বার্নি

1
@ বার্নাবাসস্যাবলাকস প্রশ্নটি জাভা স্ক্রিপ্টের জন্য বিশেষত, সি বা অন্যান্য ভাষার জন্য নয়। জাতীয় সেখানে হয় একটি পার্থক্য, দয়া করে নীচের আমার উত্তর দেখুন। যদিও প্রশ্নের জন্য প্রযোজ্য না, +1 ভাল উত্তর!
এএমকে

1
এবং আপনি সেখানে যান - +1আপনাকে Great Answerব্যাজ পেতে । সত্যিই দুর্দান্ত উত্তর। :)
রোহিত জৈন

1
এপিএল / এ ++ ভাষাও নয়। লোকেরা এগুলি প্রকাশ করতে ব্যবহার করে যে তারা ভাষার নির্দিষ্টকরণে আগ্রহী নয়, তবে সেই ভাষাগুলি এমন কিছু ভাগ করে something
বার্নি

33

i-- হিসাবে দ্রুত i++

নীচের এই কোডটি আপনার মতো দ্রুত, তবে অতিরিক্ত ভেরিয়েবল ব্যবহার করে:

var up = Things.length;
for (var i = 0; i < up; i++) {
    Things[i]
};

প্রস্তাবটি হ'ল প্রতিবার অ্যারের আকারটি মূল্যায়ন না করা। বড় অ্যারেগুলির জন্য পারফরম্যান্সের অবক্ষয় দেখা যায়।


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

অতিরিক্ত পরিবর্তনশীল একটি সাধারণ দোভাষী / সংকলকটির অপ্টিমাইজারের মাধ্যমে মুছে ফেলা হবে। পয়েন্টটি '0 এর সাথে তুলনা করুন' - আরও ব্যাখ্যার জন্য আমার উত্তর দেখুন।
এইচ।-ডির্ক স্মিট

1
: ভালো লুপ ভিতরে রাখা হয় 'আপ'for (var i=0, up=Things.length; i<up; i++) {}
thdoan

22

যেহেতু, আপনি এই বিষয়ে আগ্রহী, একটি জাভাস্ক্রিপ্ট লুপ বেঞ্চমার্ক সম্পর্কে গ্রেগ রেমেরার ওয়েব্লগ পোস্টটি একবার দেখুন, জাভাস্ক্রিপ্টে লুপ কোড করার দ্রুততম উপায় কী? :

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

আপনি খোলার মাধ্যমে একটি লুপের উপর পারফরম্যান্স পরীক্ষাও করতে পারেন https://blogs.oracle.com/greimer/resource/loop-test.html(জাভাস্ক্রিপ্ট ব্রাউজারে ব্লক করা থাকলে কাজ করে না, উদাহরণস্বরূপ, নোস্ক্রিপ্ট )।

সম্পাদনা করুন:

মিলান আদমভস্কি দ্বারা নির্মিত সাম্প্রতিক আরও একটি মানদণ্ড বিভিন্ন ব্রাউজারের জন্য রান-টাইমে এখানে সম্পাদন করা যেতে পারে ।

ম্যাক ওএস এক্স 10.6 এ ফায়ারফক্স 17.0 এ পরীক্ষার জন্য আমি নিম্নলিখিত লুপটি পেয়েছি:

var i, result = 0;
for (i = steps - 1; i; i--) {
  result += i;
}

এর আগে সবচেয়ে দ্রুততম হিসাবে:

var result = 0;
for (var i = steps - 1; i >= 0; i--) {
  result += i;
}

বেঞ্চমার্ক উদাহরণ।


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

হ্যাঁ, আমি সেই বিশদটি মিস করছি, এটি উল্লেখ করার জন্য ধন্যবাদ। লুপটিতে --i বা i ++ এর মধ্যে তত্ক্ষণিক পার্থক্য ছিল না Event
ড্রিমক্র্যাশ

19

এটি --বা না ++, এটি তুলনা অপারেশন। সঙ্গে --আপনি ব্যবহার করতে পারেন 0 সঙ্গে তুলনা, যখন সঙ্গে ++আপনি দৈর্ঘ্য সঙ্গে তুলনা করতে হবে। প্রসেসরে, শূন্যের সাথে তুলনা করা সাধারণত পাওয়া যায়, যখন সীমাবদ্ধ পূর্ণসংখ্যার সাথে তুলনা করতে একটি বিয়োগের প্রয়োজন হয়।

a++ < length

আসলে হিসাবে সংকলিত হয়

a++
test (a-length)

সংকলনের সময় প্রসেসরের উপর এটি বেশি সময় নেয়।


15

সংক্ষিপ্ত উত্তর

স্বাভাবিক কোড, বিশেষত মত একটি উচ্চ পর্যায়ের ভাষায় জন্য জাভাস্ক্রিপ্ট , সেখানে কোন কর্মক্ষমতা পার্থক্য নেই i++এবং i--

কর্মক্ষমতা বিচার্য বিষয় ব্যবহার forলুপ এবং তুলনা বিবৃতিতে ব্যবহার।

এটি সমস্ত উচ্চ স্তরের ভাষার ক্ষেত্রে প্রযোজ্য এবং জাভাস্ক্রিপ্টের ব্যবহার থেকে বেশিরভাগ ক্ষেত্রেই স্বাধীন। ব্যাখ্যাটি হ'ল নীচের লাইনে ফলাফল সংঘবদ্ধ কোড ble

বিস্তারিত ব্যাখ্যা

একটি লুপে পারফরম্যান্সের পার্থক্য দেখা দিতে পারে। পটভূমি হ'ল এসেম্বলার কোড স্তরে আপনি দেখতে পারেন যে একটিcompare with 0 মাত্র একটি বিবৃতি যা অতিরিক্ত রেজিস্টারের প্রয়োজন নেই।

এই তুলনা লুপের প্রতিটি পাসে জারি করা হয় এবং পরিমাপযোগ্য পারফরম্যান্সের উন্নতি হতে পারে।

for(var i = array.length; i--; )

এটির মতো ছদ্ম কোডে মূল্যায়ন করা হবে :

 i=array.length
 :LOOP_START
 decrement i
 if [ i = 0 ] goto :LOOP_END
 ... BODY_CODE
 :LOOP_END

মনে রাখবেন যে 0 একটি আক্ষরিক, বা অন্য কথায়, একটি ধ্রুবক মান।

for(var i = 0 ; i < array.length; i++ )

এটির মতো ছদ্ম কোডে মূল্যায়ন করা হবে (সাধারণ দোভাষী অনুবাদক অনুকূলিতকরণ):

 end=array.length
 i=0
 :LOOP_START
 if [ i < end ] goto :LOOP_END
 increment i
 ... BODY_CODE
 :LOOP_END

লক্ষ্য করুন শেষ একটি পরিবর্তনশীল যা প্রয়োজন CPU- র রেজিস্টার। এটি একটি ডাকা হতে পারে অতিরিক্ত রেজিস্টার সোয়াপিং কোডে এবং প্রয়োজন আরো ব্যয়বহুল তুলনা বিবৃতি মধ্যে ifবিবৃতি।

শুধু আমার 5 সেন্ট

উচ্চ স্তরের ভাষার জন্য, পাঠযোগ্যতা, যা রক্ষণাবেক্ষণের সুবিধে করে, একটি ছোটখাটো পারফরম্যান্স উন্নতি হিসাবে আরও গুরুত্বপূর্ণ।

সাধারণত অ্যারে শুরু থেকে শেষের ক্লাসিক পুনরাবৃত্তি আরও ভাল।

অ্যারে প্রান্ত থেকে দ্রুত পুনরাবৃত্তি সম্ভবত অনাকাঙ্ক্ষিত বিপরীত ক্রমের ফলাফলগুলি শুরু করতে

পোস্ট স্ক্রিপ্টাম

যেমন একটি মন্তব্যে জিজ্ঞাসা করা হয়েছে: পার্থক্য --iএবং i--মূল্যায়ন হয়i হ্রাস হওয়ার আগে বা পরে ।

সেরা ব্যাখ্যার চেষ্টা করে দেখুন ;-) এখানে একটি বাশ উদাহরণ দেওয়া আছে।

 % i=10; echo "$((--i)) --> $i"
 9 --> 9
 % i=10; echo "$((i--)) --> $i"
 10 --> 9

1
1+ ভাল ব্যাখ্যা। প্রশ্ন শুধুই একটা পরিধি একটু দূরে নিয়ে, আপনি মধ্যে পার্থক্য দয়া করে ব্যাখ্যা করুন পারে --iএবং i--এছাড়াও?
আফশিন মেহরাবানি

14

সাব্লাইম টেক্সট 2 এও আমি একই সুপারিশটি দেখেছি।

যেমনটি ইতিমধ্যে বলা হয়েছিল, মূল উন্নতি লুপের প্রতিটি পুনরাবৃত্তিতে অ্যারের দৈর্ঘ্যটি মূল্যায়ন করে না। এটি একটি সুপরিচিত অপ্টিমাইজেশান কৌশল এবং জাভাস্ক্রিপ্টে বিশেষভাবে দক্ষ যখন অ্যারে এইচটিএমএল ডকুমেন্টের অংশ হয় ( forসমস্ত liউপাদানগুলির জন্য একটি করছে )।

উদাহরণ স্বরূপ,

for (var i = 0; i < document.getElementsByTagName('li').length; i++)

তুলনায় অনেক ধীর

for (var i = 0, len = document.getElementsByTagName('li').length; i < len; i++)

আমি যেখানে দাঁড়িয়ে আছি সেখান থেকে আপনার প্রশ্নের ফর্মের মূল উন্নতি হ'ল এটি অতিরিক্ত ভেরিয়েবল ঘোষণা করে না ( lenআমার উদাহরণে)

তবে আপনি যদি আমাকে জিজ্ঞাসা করেন, পুরো বিষয়টি i++বনাম সম্পর্কে নয়i-- অপ্টিমাইজেশনের বিষয়ে নয়, তবে প্রতিটি পুনরাবৃত্তিতে অ্যারের দৈর্ঘ্যটি মূল্যায়ন না করার বিষয়ে (আপনি জেএসপিআরফের উপর একটি মানদণ্ড পরীক্ষা দেখতে পারেন )।


1
এখানে গণনা শব্দের ব্যতিক্রম নিতে হবে । পাভেলের উত্তরে আমার মন্তব্য দেখুন । ইসিএমএ স্পেসে বলা হয়েছে যে অ্যারের দৈর্ঘ্যটি আপনি উল্লেখ করার সময় গণনা করা হয় না।
কোজিরো

'মূল্যায়ন' আরও ভাল পছন্দ হতে পারে? আকর্ষণীয় সত্য
বিটিডব্লিউ

অতিরিক্ত পরিবর্তনশীল একটি সাধারণ দোভাষী / সংকলকটির অপ্টিমাইজারের মাধ্যমে মুছে ফেলা হবে। একই অ্যারে। দৈর্ঘ্যের মূল্যায়নের ক্ষেত্রে প্রযোজ্য। পয়েন্টটি '0 এর সাথে তুলনা করুন' - আরও ব্যাখ্যার জন্য আমার উত্তর দেখুন।
এইচ।-ডর্ক স্মিট

@ এইচ-DirkSchmitt আপনার সাধারণ-ইন্দ্রিয় উত্তর সরাইয়া, জন্য দীর্ঘ জাভাস্ক্রিপ্ট ইতিহাসে কম্পাইলার করেনি না দূরে অপ্টিমাইজ লুকআপ শৃঙ্খল কর্মক্ষমতা খরচ। আফাইক ভি 8 প্রথম চেষ্টা করেছিল।
কোজিরো

@ এইচ।-ডির্কস্কিমেট ঠিক যেমন কোজিরো বলেছিলেন, এটি তেমনি সুপরিচিত এবং সুপ্রতিষ্ঠিত কৌশল trick এমনকি এটি যদি আধুনিক ব্রাউজারগুলিতে আর প্রাসঙ্গিক না হয় তবে এটি এটিকে অপ্রচলিত করে না। এছাড়াও, দৈর্ঘ্যের জন্য একটি নতুন পরিবর্তনশীল প্রবর্তন করে বা ওপি এর প্রশ্নে কৌশলটি দিয়ে এটি করা, এটি এখনও সেরা উপায়, ইমো। এটি কেবল একটি স্মার্ট জিনিস এবং ভাল অনুশীলন, আমি মনে করি না যে জেএস
বিবিজে

13

আমি মনে করি না i--যে i++জাভাস্ক্রিপ্টের চেয়ে এটি দ্রুত say

প্রথমত , এটি পুরোপুরি জাভাস্ক্রিপ্ট ইঞ্জিন বাস্তবায়নের উপর নির্ভর করে।

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

সম্ভবত, আপনি ভেবেছিলেন যে একজন অন্যজনের চেয়ে অপচয়কারী কারণ প্রস্তাবিত উপায় হ'ল

for(var i = array.length; i--; )

তবে প্রস্তাবিত উপায়টি একটি দ্রুত অন্যটির কারণে নয়, তবে আপনি যদি লিখেন কেবল তাই

for(var i = 0; i < array.length; i++)

তারপরে প্রতিটি পুনরাবৃত্তির উপর array.length মূল্যায়ন করতে হবে (স্মার্ট স্মার্ট জাভাস্ক্রিপ্ট ইঞ্জিনটি বুঝতে পারে যে লুপ অ্যারের দৈর্ঘ্য পরিবর্তন করবে না)। যদিও এটি একটি সাধারণ বিবৃতি হিসাবে দেখায়, এটি আসলে কিছু ফাংশন যা জাভাস্ক্রিপ্ট ইঞ্জিন দ্বারা ফণা অধীনে ডেকে আনে।

অন্য কারণ, কেন i--"দ্রুত" হিসাবে বিবেচনা করা যেতে পারে তা হ'ল জাভা স্ক্রিপ্ট ইঞ্জিনটিকে লুপটি নিয়ন্ত্রণের জন্য কেবলমাত্র একটি অভ্যন্তরীণ ভেরিয়েবল বরাদ্দ করতে হবে (ভেরিয়েবলটি var i)। আপনি যদি অ্যারে.লেন্থ বা অন্য কোনও ভেরিয়েবলের সাথে তুলনা করেন তবে লুপটি নিয়ন্ত্রণ করতে একাধিক অভ্যন্তরীণ ভেরিয়েবল থাকতে হয়েছিল, এবং জাভাস্ক্রিপ্ট ইঞ্জিনের অভ্যন্তরীণ ভেরিয়েবলের সংখ্যা সীমিত সম্পদ। কম ভেরিয়েবলগুলি লুপে জেআইটির অপ্টিমাইজেশনের জন্য আরও বেশি সুযোগ ব্যবহৃত হয়। এজন্য i--দ্রুত বিবেচনা করা যেতে পারে ...


3
কীভাবে array.lengthমূল্যায়ন করা হয় সে সম্পর্কে সম্ভবত সাবধানতা অবলম্বনযোগ্য । দৈর্ঘ্য গণনা করা হয় না যখন আপনি এটি উল্লেখ করেন। (এটি কেবলমাত্র একটি সম্পত্তি যা সেট করা হয় যখনই অ্যারে সূচক তৈরি করা হয় বা পরিবর্তন করা হয় )। যখন অতিরিক্ত ব্যয় হয়, কারণ জেএস ইঞ্জিন সেই নামের জন্য অনুসন্ধানের চেইনটিকে অনুকূলিত করে না।
কোজিরো

ভাল, একমা স্পেক কী বলে তা নিশ্চিত নন, তবে বিভিন্ন জাভাস্ক্রিপ্ট ইঞ্জিনের কয়েকটি ইন্টার্নাল সম্পর্কে জেনে রাখা সহজ নয় getLength(){return m_length; }কারণ সেখানে কিছু গৃহকর্ম জড়িত রয়েছে। তবে আপনি যদি পিছনের দিকে চিন্তা করার চেষ্টা করেন: অ্যারে বাস্তবায়ন লিখতে এটি যথেষ্ট বুদ্ধিমান হবে যেখানে দৈর্ঘ্যটি আসলে গণনা করা দরকার :)
পাভেল পি

ইসিএমএ স্পেকটির জন্য দৈর্ঘ্যের সম্পত্তিটি ইতিমধ্যে গণনা করা দরকার। lengthঅবিলম্বে আপডেট করা আবশ্যক যখনই কোন সম্পত্তি-যে-is-আন-অ্যারে-সূচক যোগ অথবা পরিবর্তিত হয়।
কোজিরো

আমি যা বলতে চাইছি তা হ'ল যদি আপনি এটির বিষয়ে চিন্তা করার চেষ্টা করেন তবে অনুমানটি লঙ্ঘন করা বেশ শক্ত।
পাভেল পি

1
x86 সেই ক্ষেত্রে এআরএম এর মতো। dec/jnzবনাম inc eax / cmp eax, edx / jne
পিটার কর্ডেস

13

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

সুতরাং, আপনি এখানে যান:

সাধারণ উত্তর: i-- সাধারণত দ্রুত হয় কারণ এটি প্রতিবার সঞ্চালিত 0 এর সাথে তুলনা চালাতে হবে না, বিভিন্ন পদ্ধতিতে পরীক্ষার ফলাফল নীচে রয়েছে:

পরীক্ষার ফলাফল: এই জেএসফিউর দ্বারা "প্রমাণিত" হিসাবে , arr.pop()আসলে এখন পর্যন্ত দ্রুততম লুপ। কিন্তু মনোযোগ উপর --i, i--, i++এবং++i হিসাবে আপনি আপনার প্রশ্নের জিজ্ঞাসা, এখানে jsPerf (সেগুলি একাধিক jsPerf এর থেকে এসেছ, দয়া করে নীচের সূত্র দেখুন) ফলাফল সংক্ষিপ্ত:

--iএবং i--ফায়ারফক্স একই সময় i--দ্রুত Chrome এ নেই।

ক্রোমে লুপের জন্য একটি বেসিক ( for (var i = 0; i < arr.length; i++)) দ্রুত i--এবং --iফায়ারফক্সের চেয়ে ধীর হয়।

ক্রোম এবং ফায়ারফক্স উভয় ক্ষেত্রে একটি ক্যাশেড arr.lengthক্রোমের সাথে উল্লেখযোগ্যভাবে দ্রুত হয় প্রায় 170,000 অপস / সেকেন্ডের মধ্যে Chrome

উল্লেখযোগ্য পার্থক্য ছাড়াই, বেশিরভাগ ব্রাউজারের ++iচেয়ে দ্রুত i++, আফাইক, এটি কোনও ব্রাউজারে অন্যভাবে কখনও হয় না।

সংক্ষিপ্তসার সংক্ষিপ্তসার: arr.pop() এখন পর্যন্ত দ্রুততম লুপ; নির্দিষ্টভাবে উল্লিখিত লুপগুলির i--জন্য, দ্রুততম লুপ।

সূত্র: http://jsperf.com/fastest-array-loops-in-javascript/15 , http://jsperf.com/ipp-vs-ppi-2

আমি আশা করি এটি আপনার প্রশ্নের উত্তর দেয়।


1
মনে হচ্ছে আপনার popপরীক্ষাটি কেবলমাত্র এত তাড়াতাড়ি বলে মনে হচ্ছে কারণ এটি লুপের বেশিরভাগের জন্য অ্যারের আকার 0 থেকে কমিয়ে দিচ্ছে - যতদূর আমি বলতে পারি। যা দেন বলে মনে হয় - তবে নিশ্চিত কিছু ন্যায্য আমি প্রতিটি পরীক্ষা দিয়ে একই ভাবে অ্যারে তৈরি করতে এই jsperf পরিকল্পিত করেছি করতে .shift()আমার কয়েক ব্রাউজারের জন্য বিজয়ী হচ্ছে - আমি যদিও :) আশা করতাম কি না jsperf.com / তুলনা-লুপিং-এর বিভিন্ন ধরণের
পবল

একমাত্র উল্লেখ করার জন্য উত্সাহিত ++i: ডি
জাগডসফট

12

এটি আপনার অ্যারে মেমোরিতে স্থাপন এবং মেমোরি পৃষ্ঠাগুলির হিট অনুপাতের উপর নির্ভর করে যখন আপনি সেই অ্যারে অ্যাক্সেস করছেন।

কিছু ক্ষেত্রে হিট রেশিও বৃদ্ধির কারণে কলাম ক্রমে অ্যারে সদস্যদের অ্যাক্সেস সারি ক্রমের চেয়ে দ্রুত হয়।


1
যদি কেবল ওপি জিজ্ঞাসা করে থাকে যে একই ম্যাট্রিক্সকে বিভিন্ন
ক্রমে অনুসরণ করা

1
অপারেটিং সিস্টেমগুলিতে তাদের মেমরি পরিচালনাটি পেজিংয়ের উপর ভিত্তি করে বিবেচনা করে, যখন কোনও প্রক্রিয়াতে এমন কোনও ডেটা প্রয়োজন হয় যা ক্যাশেড পৃষ্ঠাগুলিতে থাকে না, যখন ওএসে একটি পৃষ্ঠা ত্রুটি দেখা দেয় এবং এটি অবশ্যই সিপিইউ ক্যাশে লক্ষ্য পৃষ্ঠাটি নিয়ে আসে এবং অন্য পৃষ্ঠার সাথে প্রতিস্থাপন করে, সুতরাং, প্রসেসিংয়ে ওভারহেডের কারণ ঘটায় যে লক্ষ্য পৃষ্ঠাটি সিপিইউ ক্যাশে থাকা থেকে বেশি সময় নেয় time মনে করুন যে আমরা একটি বৃহত অ্যারে সংজ্ঞায়িত করেছি যে এর প্রতিটি সারি পৃষ্ঠা ওএস আকারের চেয়ে বড় এবং আমরা সারি ক্রমে এটি অ্যাক্সেস করি, সেক্ষেত্রে পৃষ্ঠা ত্রুটির অনুপাত বৃদ্ধি পায় এবং ফলাফলটি অ্যারেটিতে কলাম অর্ডার অ্যাক্সেসের চেয়ে ধীর হয়।
আকবর বয়াতি

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

10

শেষবার যখন আমি এটি নিয়ে উদ্বিগ্ন ছিলাম তখন 50৫০২ অ্যাসেমব্লি লিখছিলাম (৮-বিট, হ্যাঁ!)। বড় লাভটি হচ্ছে বেশিরভাগ পাটিগণিত অপারেশনগুলি (বিশেষত হ্রাস) পতাকাগুলির একটি সেট আপডেট করেছে, তার মধ্যে একটি ছিল Z'শূন্যে পৌঁছেছে' নির্দেশক।

সুতরাং, লুপটির শেষে আপনি কেবল দুটি নির্দেশনা করেছিলেন: DEC(হ্রাস) এবং JNZ(শূন্য না হলে লাফিয়ে), কোনও তুলনা প্রয়োজন!


জাভাস্ক্রিপ্টের ক্ষেত্রে স্পষ্টতই এটি প্রয়োগ হয় না (যেহেতু এটি সিপিইউগুলিতে চলে যেগুলির এমন অপ-কোড নেই)। সম্ভবত পিছনে আসল কারণ i--বনাম i++যে সাবেক সঙ্গে আপনি লুপের এর সুযোগ অতিরিক্ত নিয়ন্ত্রণ ভেরিয়েবল পরিচয় করিয়ে না। নীচে আমার উত্তর দেখুন ...
পাভেল পি

1
ঠিক আছে, এটি সত্যিই প্রযোজ্য নয়; তবে এটি একটি খুব সাধারণ সি স্টাইল, এবং এটি আমাদের মধ্যে যারা অভ্যস্ত হয়ে গেছে তাদের কাছে এটি আরও পরিস্কার দেখাচ্ছে। :-)
জাভিয়ার

x86 এবং এআরএম উভয়ই এই ক্ষেত্রে 6502 এর মতো। dec/jnzপরিবর্তে inc/cmp/jnex86 ক্ষেত্রে জন্য। আপনি কোনও দ্রুত ফাঁকা লুপ চালানো দেখতে পাবেন না (উভয়ই শাখা থ্রুপুট পরিপূর্ণ করবে), তবে কিছুটা নিচে গণনা করা লুপের ওভারহেডকে হ্রাস করে। বর্তমান ইন্টেল এইচডাব্লু প্রিফেসচারগুলি মেমরি অ্যাক্সেস ধরণগুলি দ্বারা উদ্বিগ্ন নয় যা হয় উতরান ক্রমে যায় go পুরানো সিপিইউগুলি আমি মনে করি 4 টি পিছনের স্ট্রিম এবং 6 বা 10 ফরোয়ার্ড স্ট্রিম, আইআইআরসি এর মত ট্র্যাক করতে পারে।
পিটার কর্ডেস

7

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

একদিকে যেমন আপনি গ্যারান্টি দিতে পারেন তবে countসর্বদা >= 0আপনি এটিকে সহজ করতে পারবেন:

for (var i = count; i--;)
{
  // whatever
}

1
সংক্ষিপ্ত উত্স কোড অগত্যা মানে এটি দ্রুত হবে doesn't আপনি এটি পরিমাপ করেছেন?
গ্রেগ হিউগিল

ওফস আমি এটিকে মিস করেছি। মাথার উপরে পেরেক চাপলাম
রবার্ট

1
আমি সমাবেশের উত্সগুলি দেখতে চাই যেখানে 0 এর সাথে তুলনা করা আলাদা। কয়েক বছর কেটে গেছে, তবে এক সময় আমি এক টন সমাবেশ কোডিং করেছি এবং আমার জীবনের পক্ষে 0 এর সাথে তুলনা / পরীক্ষা করার উপায়টি এমনভাবে ভাবা যায় না যা সমান তত দ্রুত হতে পারে না অন্য কোনও পূর্ণসংখ্যার জন্য। তবুও, আপনি যা বলছেন তা সত্য। হতাশ হয়ে আমি বুঝতে পারি না কেন!
ব্রায়ান নোব্লাচ

7
@ ব্রায়ান নোব্লাচ: আপনি যদি "ডেক ই্যাক্স" (x86 কোড) এর মতো কোনও নির্দেশিকা ব্যবহার করেন তবে সেই নির্দেশটি স্বয়ংক্রিয়ভাবে জেড (শূন্য) পতাকা নির্ধারণ করে যা আপনি তত্ক্ষণাত্ পরীক্ষা করতে পারেন যা অন্যটির তুলনায় অন্য কোনও তুলনামূলক নির্দেশ ব্যবহার না করেই পরীক্ষা করতে পারেন।
গ্রেগ হিউগিল

1
জাভাস্ক্রিপ্টের ব্যাখ্যার সময়, আমি সন্দেহ করি যে যদিও অপকডগুলি বাধা হয়ে উঠবে। কম টোকেন হওয়ার অর্থ দোভাষী অর্থ উত্স কোডটি দ্রুত প্রক্রিয়া করতে পারে।
টড ওভেন

6

এটি আর --বা সাইনটির উপর নির্ভরশীল নয় ++, তবে এটি লুপটিতে আপনি যে শর্ত প্রয়োগ করেছেন তার উপর নির্ভর করে।

উদাহরণস্বরূপ: আপনার লুপটি অ্যারের দৈর্ঘ্যের মতো বা অন্যান্য শর্তের মতো প্রতিবার লুপ চেক শর্তের চেয়ে যদি ভেরিয়েবলের স্থির মান থাকে তবে আপনার লুপটি দ্রুত।

তবে এই অপ্টিমাইজেশন সম্পর্কে চিন্তা করবেন না, কারণ এবার এর প্রভাবটি ন্যানোসেকেন্ডে পরিমাপ করা হয়েছে।


একাধিক ন্যানোসেকেন্ড লুপগুলি সেকেন্ডে পরিণত হতে পারে ... আপনার যখন সময় আসবে তখন অনুকূলিত হওয়া কখনই খারাপ ধারণা নয়
বুক্সি

6

for(var i = array.length; i--; )খুব দ্রুত হয় না। তবে আপনি যখন প্রতিস্থাপন array.lengthকরবেন super_puper_function(), তা উল্লেখযোগ্যভাবে হতে পারে দ্রুত (যেহেতু এটি প্রতিটি পুনরাবৃত্তিতে বলা হয়)। এটাই পার্থক্য।

আপনি যদি 2014 সালে এটি পরিবর্তন করতে চলেছেন তবে আপনাকে অপ্টিমাইজেশান সম্পর্কে ভাবার দরকার নেই। আপনি যদি এটি "অনুসন্ধান ও প্রতিস্থাপন" দিয়ে পরিবর্তন করতে চলেছেন, আপনার অপ্টিমাইজেশন সম্পর্কে ভাবার দরকার নেই। আপনার যদি সময় না থাকে তবে আপনাকে অপ্টিমাইজেশন সম্পর্কে ভাবার দরকার নেই। তবে এখন, আপনি এটি সম্পর্কে চিন্তা করার সময় পেয়েছেন।

পিএস: এর i--চেয়ে দ্রুত নয় i++


6

এটি সংক্ষিপ্তভাবে কাটাতে: জাভাস্ক্রিপ্টে এটি করার ক্ষেত্রে একেবারেই কোনও পার্থক্য নেই।

প্রথমত, আপনি নিজে এটি পরীক্ষা করতে পারেন:

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

আপনি যতদূর দেখতে পাচ্ছেন, কোনও পরিবেশে পারফরম্যান্সের মধ্যে কোনও পার্থক্য নেই।

আপনি যদি আপনার স্ক্রিপ্টের কর্মক্ষমতা উন্নত করতে চান তবে যে কাজগুলি আপনি করতে চেষ্টা করতে পারেন:

  1. একটি var a = array.length;বিবৃতি রাখুন যাতে আপনি প্রতিবার লুপটিতে এর মান গণনা করবেন না
  2. লুপ আনলোলিং করুন http://en.wikedia.org/wiki/Loop_unwinding

তবে আপনাকে বুঝতে হবে যে উন্নতি আপনি অর্জন করতে পারবেন তা তুচ্ছ হবে, বেশিরভাগ ক্ষেত্রে আপনার এটির যত্ন নেওয়া উচিত নয়।

আমার নিজের মতামত কেন এই জাতীয় ভুল ধারণা (ডিসেম্বর বনাম ইনক) হাজির

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

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


আকর্ষণীয়, তবে উইন 7-তে আপনার ফায়ারফক্সের 16.0.2 এর অধীনে চলমান পরীক্ষাগুলির জন্য, হ্রাস লুপটি 29% ধীর ছিল ... সম্পাদনা: এটিকে উপেক্ষা করুন। বারবার পরীক্ষাগুলি অনিবার্য প্রমাণিত হয়েছিল, পরবর্তী রানগুলির জন্য আমার পরীক্ষার ফলাফলগুলিতে অবাক করে দেওয়ার মতো শব্দ রয়েছে। কেন নিশ্চিত তা নিশ্চিত নয়।

হ্যাঁ আমি অন্য সমস্ত কিছু বন্ধ করে এবং কেবল পরীক্ষা চালিয়ে এইটির জন্য অ্যাকাউন্ট করার চেষ্টা করেছি। তবুও খুব খারাপ ফলাফল পেয়েছে। খুব অদ্ভুত.

আমি মনে করি আপনি আসল পয়েন্টটি মিস করেছেন কেন শূন্যে যাওয়া জাভাস্ক্রিপ্টে ভাল বলে বিবেচিত হয়। এটি বেশিরভাগ কারণেই কেবলমাত্র একটি ভেরিয়েবল নিয়ন্ত্রণ করে লুপ এক্সিকিউশন, যেমন এইভাবে অপটিমাইজার / জিতারের উন্নতির আরও জায়গা রয়েছে। ব্যবহার করা array.lengthঅগত্যা পারফরম্যান্স পেনাল্টি বহন করে না, কেবল জেএস ভার্চুয়াল মেশিনটি লুপের শরীরে অ্যারে সংশোধিত না হলে এটি নির্ধারণের জন্য যথেষ্ট স্মার্ট। আমার উত্তর নীচে দেখুন।
পাভেল পি

1
নাইটপিকিং: এই প্রাচীন ঘটনাটি (সমাবেশ ভাষা অপ্টিমাইজেশান) অপ্রচলিত নয় , কেবল আরকেন। যেমনটি আপনি সত্যই না করেন তা জানার দরকার নেই। :-)
জেভিয়ার

6

আমি জেএসবেঞ্চের সাথে তুলনা করেছি

অ্যালাস্টানি উল্লেখ করেছেন যে, একটি জিনিস যা আরোহণের লুপগুলিতে সময় নেয়, তা হ'ল প্রতিটি পুনরাবৃত্তির জন্য আপনার অ্যারের আকারের মূল্যায়ন। এই লুপে:

for ( var i = 1; i <= array.length; i++ )

আপনি .lengthপ্রতিটি বার বৃদ্ধি যখন আপনি মূল্যায়ন i। এই এক:

for ( var i = 1, l = array.length; i <= l; i++ )

আপনি .lengthকেবল একবার মূল্যায়ন করেন , যখন আপনি ঘোষণা করেন i। এই এক:

for ( var i = array.length; i--; )

তুলনা জড়িত, এটি হ্রাসের ঠিক আগে ঘটে iএবং কোডটি খুব পঠনযোগ্য। যাইহোক, কি একটি ভয়ঙ্কর পার্থক্য করতে পারে, আপনি লুপ ভিতরে রাখা কি।

ফাংশনে কল সহ লুপ (অন্য কোথাও সংজ্ঞায়িত):

for (i = values.length; i-- ;) {
  add( values[i] );
}

ইনলাইনড কোড সহ লুপ:

var sum = 0;
for ( i = values.length; i-- ;) {
  sum += values[i];
}

যদি আপনি আপনার কোডটি ইনলাইন করতে পারেন, উপযুক্ততার ত্যাগ ছাড়াই কোনও ফাংশন কল করার পরিবর্তে, আপনি একটি লুপ দ্রুততরতার একটি ক্রম পেতে পারেন!


দ্রষ্টব্য : ব্রাউজারটি সাধারণ ফাংশনগুলি ইনলাইনে করার জন্য যেহেতু আপনার কোডটি কতটা জটিল তা নির্ভর করে। সুতরাং, অনুকূলকরণের আগে প্রোফাইল, কারণ

  1. বাধাটি অন্য কোথাও হতে পারে (এজাক্স, রিফ্লো, ...)
  2. আপনি একটি ভাল অ্যালগরিদম চয়ন করতে পারেন
  3. আপনি একটি ভাল ডেটা কাঠামো চয়ন করতে পারেন

কিন্তু মনে রেখ:

লোকেরা পড়ার জন্য কোড লেখা হয়, এবং ঘটনাক্রমে কেবল মেশিনগুলি কার্যকর করতে।


এই উত্তর এবং মানদণ্ডের জন্য +1। আমি প্রতিটি পরীক্ষার জন্য যুক্ত করেছি এবং ব্রাউজারে পাশাপাশি নোডে চালিতযোগ্য একটি স্বতন্ত্র ফাইলটিতে মাপদণ্ডটি পুনরায় কাজ করেছি। jsfiddle.net/hta69may/2 । নোডের জন্য "বিপরীত লুপ, অন্তর্নিহিত তুলনা, ইনলাইনড কোড" সবচেয়ে দ্রুত। তবে এফএফ 50 এ পরীক্ষায় কৌতূহল ফলাফল দেখানো হয়েছিল: কেবল সময়গুলি প্রায় 10 গুণ কম (!) ছিল না তবে উভয় "forEach" টেস্টগুলি "বিপরীত লুপ" হিসাবে তত দ্রুত ছিল। হতে পারে নোড ছেলেরা ভি 8 এর পরিবর্তে মজিলার জেএস ইঞ্জিন ব্যবহার করবে? :)
Fr0sT

4

আপনি এখন যেভাবে এটি করছেন তা দ্রুত নয় (এটি একটি অনির্দিষ্ট লুপ বাদে, আমি অনুমান করি আপনি কী করতে চেয়েছিলেন i--

আপনি যদি এটি দ্রুত করতে চান তবে করুন:

for (i = 10; i--;) {
    //super fast loop
}

অবশ্যই আপনি এটি একটি ছোট লুপ লক্ষ্য করবেন না। এটির দ্রুত কারণ হ'ল আপনি "হ'ল" সত্য "(এটি 0 টিতে পৌঁছলে" মিথ্যা "হিসাবে মূল্যায়ন করে) যাচাই করার সময় আপনি আমাকে হ্রাস করছেন


1
আপনি কি আধা কোলন অনুপস্থিত? (i = 10; i--;)
searlea

হ্যাঁ হ্যাঁ, আমি ভুলটি স্থির করেছি। এবং যদি আমরা বাছাই করতে যাচ্ছি আমি আপনাকে নির্দেশ করব যে আপনি আপনার আইএম এর পরে আপনার অর্ধ কোলনটি ভুলে গেছেন! হেহ।
djdd87

কেন দ্রুত হবে? সংক্ষিপ্ত উত্সটির অর্থ এটি দ্রুত হবে না। আপনি এটি পরিমাপ করেছেন?
গ্রেগ হিউগিল

4
হ্যাঁ, আমি এটি পরিমাপ করেছি এবং আমি বলছি না যে খাটো উত্স এটি দ্রুত করে তোলে, তবে কম অপারেশনগুলি এটিকে দ্রুত করে তোলে।
পেরিরিক্স

4

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

লুপের জন্য কোডিংয়ের প্রচলিত উপায় এটির মতো অ্যারে লিস প্রক্রিয়া করার জন্য:

for (var i = 0; i < myArray.length; i++) {...

এটির সাথে সমস্যাটি হ'ল myArray.length ব্যবহার করে অ্যারের দৈর্ঘ্যের মূল্যায়ন করতে সময় লাগে এবং আমরা যেভাবে লুপটি কোড করেছিলাম তার অর্থ এই মূল্যায়ন প্রতিবার লুপের চারপাশে সম্পাদন করতে হবে। অ্যারেতে যদি 1000 উপাদান থাকে তবে অ্যারের দৈর্ঘ্য 1001 বার মূল্যায়ন করা হবে। আমরা যদি রেডিও বোতামগুলির দিকে চেয়ে থাকতাম এবং মাইফর্ম.মাইব্যাটসনলেথটি থাকতাম তবে নির্ধারণ করতে আরও বেশি সময় লাগবে কারণ নির্দিষ্ট ফর্মের মধ্যে যথাযথ গ্রুপের বোতামগুলি অবশ্যই লুপের চারপাশে প্রতিটি সময় মূল্যায়ন করার আগে উপস্থিত হওয়া আবশ্যক।

স্পষ্টতই আমরা প্রসেস করার সময় অ্যারের দৈর্ঘ্য পরিবর্তিত হবে বলে আশা করি না সুতরাং দৈর্ঘ্যের এই সমস্ত পুনর্নির্মাণগুলি কেবল প্রক্রিয়াকরণের সময়গুলিতে অযৌক্তিকভাবে যুক্ত হচ্ছে। (অবশ্যই যদি আপনার লুপের ভিতরে কোড থাকে যা অ্যারের এন্ট্রিগুলিকে যুক্ত করে বা সরিয়ে দেয় তবে অ্যারের আকারটি পুনরাবৃত্তির মধ্যে পরিবর্তন করতে পারে এবং তাই আমরা এর জন্য পরীক্ষিত কোডটি পরিবর্তন করতে পারি না)

আকারটি স্থির হওয়া লুপটির জন্য আমরা এটি সংশোধন করতে যা করতে পারি তা হ'ল লুপের শুরুতে একবারে দৈর্ঘ্যের মূল্যায়ন করা এবং এটি একটি পরিবর্তনশীলে সংরক্ষণ করা save এরপরে আমরা কখন লুপটি শেষ করব তা স্থির করতে ভেরিয়েবলটি পরীক্ষা করতে পারি। এটি প্রতিটি সময় অ্যারের দৈর্ঘ্যের মূল্যায়ন করার চেয়ে খুব দ্রুততর হয় বিশেষত যখন অ্যারেটিতে কয়েকটি প্রবেশাধিকারের চেয়ে বেশি থাকে বা ওয়েব পৃষ্ঠার অংশ হয়।

এটি করার কোডটি হ'ল:

for (var i = 0, var j = myArray.length; i < j; i++) {...

সুতরাং এখন আমরা কেবল একবার অ্যারের আকারটি মূল্যায়ন করব এবং ভেরিয়েবলের বিরুদ্ধে আমাদের লুপ কাউন্টারটি পরীক্ষা করব যা প্রতিবার লুপের চারপাশে সেই মানটি ধরে রাখে। এই অতিরিক্ত পরিবর্তনশীল অ্যারের আকারের মূল্যায়নের চেয়ে অনেক দ্রুত অ্যাক্সেস করা যায় এবং তাই আমাদের কোডটি আগের চেয়ে অনেক দ্রুত চলবে। আমাদের স্ক্রিপ্টে কেবল একটি অতিরিক্ত পরিবর্তনশীল রয়েছে।

যতক্ষণ না অ্যারের সমস্ত এন্ট্রি প্রক্রিয়াজাত হয় ততক্ষণ আমরা অ্যারেটিকে কী অর্ডার প্রসেস করি তা বিবেচনা করে না। যেখানে এটি হ'ল আমরা কেবল অতিরিক্ত অতিরিক্ত পরিবর্তনশীল যা আমরা সবে যুক্ত করেছি এবং অ্যারেটিকে বিপরীত ক্রমে প্রক্রিয়াকরণ করে কিছুটা দ্রুত করে আমাদের কোডটি তৈরি করতে পারি।

চূড়ান্ত কোড যা আমাদের অ্যারেটিকে সবচেয়ে কার্যকর উপায়ে প্রক্রিয়া করে তা হ'ল:

for (var i = myArray.length-1; i > -1; i--) {...

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


4

++ বনাম -- কোনও ব্যাপার নয় কারণ জাভাস্ক্রিপ্ট একটি বর্ণিত ভাষা, সংকলিত ভাষা নয়। প্রতিটি নির্দেশ একাধিক মেশিনের ভাষায় অনুবাদ করে এবং আপনার গুরূত্বপূর্ণ বিশদ সম্পর্কে যত্ন নেওয়া উচিত নয়।

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

আপনার পঠনযোগ্য কোড লেখা উচিত।


3

অনেক ক্ষেত্রে, প্রসেসরগুলি অন্যান্য তুলনার তুলনায় দ্রুত শূন্যের সাথে তুলনা করতে পারে এই সত্যতার সাথে এর কোনও সম্পর্ক নেই।

এটি কারণ কেবলমাত্র কয়েকটি জাভাস্ক্রিপ্ট ইঞ্জিন (জেআইটি তালিকায় থাকা) আসলে মেশিন ল্যাঙ্গুয়েজ কোড তৈরি করে rate

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

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


3

ঠিক আছে, আমি জাভাস্ক্রিপ্ট সম্পর্কে জানি না, এটি পুনরায় মূল্যায়নের অ্যারে দৈর্ঘ্যের সত্যই হওয়া উচিত এবং এসোসিয়েটিভ অ্যারেগুলির সাথে করার মতো কিছু হতে পারে (যদি আপনি কেবল হ্রাস করেন তবে নতুন এন্ট্রিগুলি বরাদ্দ করার দরকার নেই - যদি অ্যারেটি ঘন হয়, এটির জন্য কেউ অনুকূলিত হতে পারে)।

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

আমি এই নিম্ন-স্তরের পার্থক্যগুলি ব্যাখ্যা করা ভাষাগুলির উপর এত বড় প্রভাব ফেলতে পারব না, আমি কেবল প্রতিক্রিয়ার মধ্যে ডিজেএনজেড দেখিনি তাই আমি ভেবেছিলাম আমি একটি আকর্ষণীয় চিন্তাভাবনা করব।


রেকর্ডের জন্য, DJNZএটি 8051 (z80) আইএসএর একটি নির্দেশনা। x86 এর dec/jnzপরিবর্তে রয়েছে inc/cmp/jneএবং বাহ্যত বাহুতে কিছু মিল রয়েছে। আমি নিশ্চিত যে এটি জাভাস্ক্রিপ্ট পার্থক্যের কারণ নয়; এটি লুপ অবস্থায় আরও স্পষ্ট করা থেকে।
পিটার কর্ডেস

3

এটা ব্যবহার যে --i দ্রুত ছিল (সি ++ তে) কারণ কেবলমাত্র একটি ফলাফল রয়েছে, হ্রাসকৃত মান। i-- হ্রাসকৃত মানটিকে i এ আবার সংরক্ষণ করতে হবে এবং ফলাফল হিসাবে মূল মানটিও ধরে রাখতে হবে (j = i--;)। বেশিরভাগ সংকলকগুলিতে এটি একের পরিবর্তে দুটি রেজিস্টার ব্যবহার করেছিল যা একটি রেজিস্টার ভেরিয়েবল হিসাবে ধরে রাখার পরিবর্তে মেমরিতে অন্য ভেরিয়েবলটি লেখার কারণ হতে পারে।

আমি অন্যদের সাথে একমত যারা এই দিনগুলিতে এটি কোনও পার্থক্য করে না বলেছে।


3

খুব সাধারণ কথায়

"i-- এবং আমি ++। প্রকৃতপক্ষে, তারা উভয়েই একই সময় নেয়"।

তবে এই ক্ষেত্রে যখন আপনার ক্রমবর্ধমান অপারেশন থাকে .. প্রসেসর প্রতিটি সময় পরিবর্তনশীল 1 দ্বারা দৈর্ঘ্য মূল্যায়ন করে এবং হ্রাসের ক্ষেত্রে .. বিশেষত এই ক্ষেত্রে, এটি 0 দৈর্ঘ্যের মূল্যায়ন করবে কেবলমাত্র একবার 0 না পাওয়া পর্যন্ত।


3

প্রথমে i++এবং i--জাভাস্ক্রিপ্ট সহ যে কোনও প্রোগ্রামিং ভাষাতে ঠিক একই সময় নিন।

নিম্নলিখিত কোডটি অনেক আলাদা সময় নেয়।

ফাস্ট:

for (var i = 0, len = Things.length - 1; i <= len; i++) { Things[i] };

মন্থর:

for (var i = 0; i <= Things.length - 1; i++) { Things[i] };

সুতরাং নিম্নলিখিত কোডটিও বিভিন্ন সময় নেয়।

ফাস্ট:

for (var i = Things.length - 1; i >= 0; i--) { Things[i] };

মন্থর:

for (var i = 0; i <= Things.length - 1; i++) { Things[i] };

কম্পাইলারের অপ্টিমাইজেশনের কারণে পিএস স্লো কেবল কয়েকটি ভাষার জন্য (জাভাস্ক্রিপ্ট ইঞ্জিন) ধীর। সেরা উপায় হ'ল '<' পরিবর্তে '<=' (বা '=') এবং '----' এর পরিবর্তে 'আই--' ব্যবহার করা


3

I-- বা i ++ দ্বারা প্রচুর সময় ব্যয় হয় না। আপনি CPU- র আর্কিটেকচারের ভিতরে গভীর যান ++চেয়ে বেশি দ্রুত হয় --, যেহেতু --অপারেশন সম্পূরক 2 এর কি করতে হবে, কিন্তু এটা হার্ডওয়্যার ভিতরে হলো তাই এই এটি দ্রুত এবং তাদের মধ্যে কোন প্রধান পার্থক্য করতে হবে ++এবং --এই অপারেশনের বলে মনে করা হয় সিপিইউতে কমপক্ষে সময় ব্যয় হয়।

লুপ জন্য ভালো সঞ্চালিত হয়:

  • শুরুতে একবার ভেরিয়েবল শুরু করুন।
  • লুপ দ্বিতীয় প্রতীক মধ্যে বাধ্যতা পরীক্ষা করে দেখুন, <, >, <=, ইত্যাদি
  • তারপরে লুপটি প্রয়োগ করুন।
  • লুপ বৃদ্ধি এবং লুপ আবার এই প্রক্রিয়া আবার নিক্ষেপ।

সুতরাং,

for (var i = Things.length - 1; i >= 0; i--) {
    Things[i]
}; 

শুরুতে একবার অ্যারের দৈর্ঘ্য গণনা করা হবে এবং এটি অনেক সময় নয়, তবে

for(var i = array.length; i--; ) 

প্রতিটি লুপের দৈর্ঘ্য গণনা করবে, সুতরাং এটি অনেক সময় ব্যয় করবে।


var i = Things.length - 1; i >= 0; i--দৈর্ঘ্য 1 বার গণনা করবে।
দিমিত্রি

1
আমি নিশ্চিত না " --অপারেশন 2 এর পরিপূরকটি কী করবে" এর অর্থ কী, তবে আমি ধরে নিই এর অর্থ এটি কোনও উপকার করবে। না, এটি কোনও আর্কিটেকচারের কোনও কিছুর উপেক্ষা করে না। 1 কে বিয়োগ করা 1 যোগ করার মতোই সহজ, আপনি কেবল একটি সার্কিট তৈরি করেন যা বহন করার চেয়ে ধার নেয় b
ওলাথে

1

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

উত্তরটি সম্ভবত আপনি কোন ব্রাউজারটি ব্যবহার করছেন তার উপর নির্ভর করবে। কিছু অন্যের তুলনায় বিভিন্ন ফলাফল হবে।


4
এটি আরও দ্রুত কেন তার প্রশ্নের উত্তর দেয় না । কেন সে উপায় সে সম্পর্কে কোনও জ্ঞান ছাড়াই তিনি কেবল একটি মানদণ্ড
পেয়েছিলেন

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

4
-1 আমি সম্পূর্ণরূপে একমত নই যে এটি চেষ্টা করাই সর্বোত্তম পন্থা। কয়েকটি উদাহরণ সম্মিলিত জ্ঞানকে প্রতিস্থাপন করে না এবং এটি ফোরামের পুরো পয়েন্ট।
ক্রিস্টোফ

1

এটি ভালবাসা, প্রচুর চিহ্ন আপ কিন্তু উত্তর নেই: ডি

কেবল শূন্যের তুলনায় তুলনা করা সবসময় দ্রুততম তুলনা

সুতরাং (a == 0) আসলে (a == 5) এর চেয়ে সত্য প্রত্যাবর্তনে দ্রুততর

এটি ছোট এবং তুচ্ছ এবং সংগ্রহের 100 মিলিয়ন সারি সহ এটি পরিমাপযোগ্য।

অর্থাত্ একটি লুপ আপ আপনি বলতে পারেন যেখানে আমি <= অ্যারে. দৈর্ঘ্য এবং বৃদ্ধি বৃদ্ধি i

ডাউন লুপে আপনি বলছেন যেখানে i> = 0 এবং তার পরিবর্তে আমি হ্রাস পাচ্ছি।

তুলনা দ্রুত হয়। লুপটির 'দিকনির্দেশ' নয়।


যেমনটি বলা হয়েছে তেমন কোনও প্রশ্নের উত্তর নেই কারণ জাভাস্ক্রিপ্ট ইঞ্জিনগুলি সমস্ত আলাদা এবং উত্তরটি ঠিক কোন ব্রাউজারটি আপনি পরিমাপ করছেন তার উপর নির্ভর করে।
গ্রেগ হিউগিল

এটি শূন্যের তুলনায় মৌলিকভাবে গ্রহণযোগ্য তুলনাগুলি দ্রুততম। যদিও আপনার বক্তব্যগুলি সঠিক এবং শূন্যের সাথে তুলনা করার সুবর্ণ নিয়ম চূড়ান্ত।
রবার্ট

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

1

অন্যদের একটি হেডাচ এড়ানোর জন্য সহায়তা করুন --- এটির ভোট দিন !!!

এই পৃষ্ঠার সর্বাধিক জনপ্রিয় উত্তর ফায়ারফক্স 14 এর জন্য কাজ করে না এবং jsLinter পাস করে না। "যখন" লুপগুলির একটি তুলনা অপারেটরের প্রয়োজন, কোনও অ্যাসাইনমেন্ট নয়। এটি ক্রোম, সাফারি এবং এমনকি উপর কাজ করে। তবে ফায়ার ফক্সে মারা যায়।

এই ভেঙে গেছে!

var i = arr.length; //or 10
while(i--)
{
  //...
}

এই কাজ করবে! (ফায়ারফক্সে কাজ করে, jsLinter পাস করে)

var i = arr.length; //or 10
while(i>-1)
{
  //...
  i = i - 1;
}

2
আমি এটি ফায়ারফক্স ১৪ এ চেষ্টা করেছি এবং এটি দুর্দান্ত কাজ করেছে। আমি উত্পাদন গ্রন্থাগারগুলির উদাহরণ দেখেছি যা ব্যবহার করে while (i--)এবং যা বহু ব্রাউজার জুড়ে কাজ করে। আপনার পরীক্ষা সম্পর্কে কিছু অদ্ভুত থাকতে পারে? আপনি কি ফায়ারফক্স 14 এর বিটা সংস্করণ ব্যবহার করছেন?
ম্যাট ব্রাউন

1

এটি কেবল অনুমান, তবে সম্ভবত এটি হ'ল কারণ প্রসেসরের পক্ষে অন্য মানের (i <থিংস লেন্থ) এর পরিবর্তে 0 (i> = 0) এর সাথে কোনও কিছুর তুলনা করা সহজ।


3
+1 অন্যরা ভোট দেয় না। যদিও। দৈর্ঘ্যের পুনরাবৃত্তি মূল্যায়ন প্রকৃত ইনক / হ্রাসের চেয়ে অনেক বেশি সমস্যা, লুপের শেষের জন্য পরীক্ষা করা গুরুত্বপূর্ণ হতে পারে। আমার সি সংকলকটি লুপগুলিতে কিছু সতর্কতা দেয় যেমন: "মন্তব্য # 1544-ডি: (ইউএলপি 13.1) লুপ গণনা সনাক্ত করা হয়েছে Recommend
জিরোস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.