আপনার শিক্ষক যা বলেছেন তা হ'ল কিছু স্পষ্টতা ছাড়াই কিছু তিরস্কার statement এটি হ'ল না যে হ্রাস হ্রাস বৃদ্ধির চেয়ে দ্রুত তবে আপনি ইনক্রিমেন্টের তুলনায় হ্রাস সহ অনেক দ্রুত লুপ তৈরি করতে পারেন।
এটি সম্পর্কে দীর্ঘায়িত না করে, লুপ কাউন্টার ইত্যাদি ব্যবহারের প্রয়োজন ছাড়াই - নীচের বিষয়গুলি কেবল গতি এবং লুপ গণনা (শূন্য নয়)।
এখানে বেশিরভাগ লোকেরা 10 টি পুনরাবৃত্তির সাহায্যে লুপ প্রয়োগ করে:
int i;
for (i = 0; i < 10; i++)
{
//something here
}
99% ক্ষেত্রে এটি সবার প্রয়োজন হতে পারে তবে পিএইচপি, পাইথন, জাভাস্ক্রিপ্টের পাশাপাশি সময় সমালোচনামূলক সফটওয়্যার (সাধারণত এমবেডড, ওএস, গেমস ইত্যাদি) এর পুরো বিশ্ব রয়েছে যেখানে সিপিইউ টিক্স সত্যই গুরুত্বপূর্ণ তাই এর সমাবেশ কোডটি সংক্ষেপে দেখুন:
int i;
for (i = 0; i < 10; i++)
{
//something here
}
সংকলনের পরে (অপ্টিমাইজেশন ছাড়াই) সংকলিত সংস্করণটি এর মতো দেখতে পাওয়া যাবে (ভিএস ২০১৫):
-------- C7 45 B0 00 00 00 00 mov dword ptr [i],0
-------- EB 09 jmp labelB
labelA 8B 45 B0 mov eax,dword ptr [i]
-------- 83 C0 01 add eax,1
-------- 89 45 B0 mov dword ptr [i],eax
labelB 83 7D B0 0A cmp dword ptr [i],0Ah
-------- 7D 02 jge out1
-------- EB EF jmp labelA
out1:
পুরো লুপটি 8 নির্দেশ (26 বাইট)। এতে - 2 টি শাখা সহ 6 টি নির্দেশনা (17 বাইট) রয়েছে। হ্যাঁ হ্যাঁ আমি জানি এটি আরও ভাল করা যায় (এটির একটি উদাহরণ)।
এখন এই ঘন ঘন নির্মাণটি বিবেচনা করুন যা আপনি প্রায়শই এমবেডড বিকাশকারী দ্বারা লিখিত দেখতে পাবেন:
i = 10;
do
{
//something here
} while (--i);
এটি 10 বারও পুনরাবৃত্তি করে (হ্যাঁ আমি জানি লুপের সাথে দেখানো তুলনায় আমি মানটি আলাদা তবে আমরা এখানে পুনরাবৃত্তির গণনা সম্পর্কে যত্নশীল)। এটি এতে সংকলিত হতে পারে:
00074EBC C7 45 B0 01 00 00 00 mov dword ptr [i],1
00074EC3 8B 45 B0 mov eax,dword ptr [i]
00074EC6 83 E8 01 sub eax,1
00074EC9 89 45 B0 mov dword ptr [i],eax
00074ECC 75 F5 jne main+0C3h (074EC3h)
5 নির্দেশাবলী (18 বাইট) এবং কেবল একটি শাখা। লুপটিতে 11 টি নির্দেশনা রয়েছে (11 বাইট)
সেরা জিনিসটি হ'ল কিছু সিপিইউতে (x86 / x64 সামঞ্জস্যপূর্ণ অন্তর্ভুক্ত) নির্দেশনা রয়েছে যা কোনও নিবন্ধক হ্রাস করতে পারে, পরে শূন্যের সাথে ফলাফলের তুলনা করে এবং ফলাফল শূন্যের চেয়ে আলাদা হলে শাখা সম্পাদন করে। কার্যত সমস্ত পিসি সিপাস এই নির্দেশনাটি প্রয়োগ করে। এটি লুপটি ব্যবহার করা আসলে একটি মাত্র (হ্যাঁ এক) 2 বাইট নির্দেশ:
00144ECE B9 0A 00 00 00 mov ecx,0Ah
label:
// something here
00144ED3 E2 FE loop label (0144ED3h) // decrement ecx and jump to label if not zero
কোনটি দ্রুত তা আমাকে ব্যাখ্যা করতে হবে?
এখন এমনকি যদি নির্দিষ্ট সিপিইউ উপরোক্ত নির্দেশনাটি প্রয়োগ না করে তবে এটি অনুকরণের জন্য প্রয়োজনীয় এটি হ্রাস হ'ল তারপরে শর্তসাপূর্ণ লাফ দেওয়া যদি পূর্ববর্তী নির্দেশনার ফলাফলটি শূন্য হয়।
কিছু ক্ষেত্রে নির্বিশেষে যে কোনও মন্তব্য হিসাবে আপনি কেন আমি ভুল ইত্যাদি ইত্যাদি হিসাবে চিহ্নিত করতে পারি E আমি নিশ্চিত করি - হ্যাঁ এটি কীভাবে, কেন এবং কখন জানলে ডাউনলোড লুপ করা সুবিধাজনক।
পুনশ্চ. হ্যাঁ আমি জানি যে বুদ্ধিমান সংকলক (যথাযথ অপ্টিমাইজেশন স্তর সহ) লুপের জন্য পুনরায় লিখবে (আরোহী লুপের কাউন্টার সহ) ধ্রুবক লুপ পুনরাবৃত্তির জন্য সমতুল্য ... (বা এটি আনরোল করুন) ...