(1) বনাম (;;) জন্য একটি গতি পার্থক্য আছে?


154

দীর্ঘ সংস্করণ ...

while (1)পার্ল স্ক্রিপ্টে আমার ব্যবহার আরও for (;;)দ্রুত দেখার পরে একজন সহকর্মী আজ জোর দিয়েছিলেন । আমি যুক্তি দিয়েছিলাম যে তাদের অনুরূপ হওয়া উচিত আশা করে যে দোভাষী যেকোন মতপার্থক্যটিকে অনুকূল করে তুলবেন। আমি একটি স্ক্রিপ্ট সেট আপ করেছি যা লুপ পুনরাবৃত্তির জন্য 1000,000,000 চালাবে এবং একই সময়ে লুপগুলি এবং সময়টির মধ্যে রেকর্ড করে। আমি কোন প্রশংসনীয় পার্থক্য খুঁজে পাইনি। আমার সহকর্মী বলেছিলেন যে একজন অধ্যাপক তাকে বলেছিলেন যে এটি while (1)তুলনা করছে 1 == 1এবং তা for (;;)হচ্ছে না। আমরা 100x এর সাথে একই পরীক্ষার পুনরাবৃত্তি করলাম সি ++ সহ পুনরাবৃত্তির সংখ্যা এবং পার্থক্যটি নগন্য। এটি তবে একটি সঙ্কলিত কোড বনাম কোনও স্ক্রিপ্টিং ভাষা হতে পারে তার একটি গ্রাফিক উদাহরণ ছিল।

সংক্ষিপ্ত সংস্করণ...

আপনার যদি অসীম লুপটি ভেঙে ফেলার প্রয়োজন হয় তবে while (1)ওভার ওভার পছন্দ করার কোনও কারণ আছে কি for (;;)?

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

আপডেট: উপরে উল্লিখিত সহকর্মী নীচে একটি প্রতিক্রিয়া সঙ্গে ওজন।

এটি কবর দেওয়ার ক্ষেত্রে এখানে উদ্ধৃত।

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


4
আমি কৌতুহলী. পার্ল স্ক্রিপ্টে কেন অসীম লুপের প্রয়োজন? আপনি সম্ভবত কোনও ড্রাইভার বা কোনও সিস্টেমে কোনও প্রোগ্রামিং করছেন না ... অসীম দীর্ঘ দীর্ঘ :-)
লুক এম

125
কোন অসীম লুপটি দ্রুততম? এলএল ... "আমার নতুন কম্পিউটারটি এত দ্রুত, এটি কেবল এক ঘন্টার মধ্যে একটি অসীম লুপ চালায় ..." ;-)
আরজান আইনবু

8
সে কি সমাজবিজ্ঞানের একজন অধ্যাপক যিনি তাকে তা বলেছিলেন? আধুনিক যুগে, আপনি যে কোডটি টাইপ করেন তা কম্পিউটার দেখা শেষ করে না।
ব্রায়ান ডি ফাই

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

4
সংকলকটি কেন এমন কোনও পরীক্ষা করার জন্য কোড তৈরি করে যে এটি জানে যে তার কোনও পার্শ্ব প্রতিক্রিয়া নেই এবং এর ফলাফলটি সংকলকটি ইতিমধ্যে জানে? ওটা কোন অর্থ প্রকাশ করে না.
ডেভিড শোয়ার্টজ

উত্তর:


218

পার্লে, তারা একই অপকডগুলিতে ফল দেয়:

$ perl -MO=Concise -e 'for(;;) { print "foo\n" }'
a  <@> leave[1 ref] vKP/REFC ->(end)
1     <0> enter ->2
2     <;> nextstate(main 2 -e:1) v ->3
9     <2> leaveloop vK/2 ->a
3        <{> enterloop(next->8 last->9 redo->4) v ->4
-        <@> lineseq vK ->9
4           <;> nextstate(main 1 -e:1) v ->5
7           <@> print vK ->8
5              <0> pushmark s ->6
6              <$> const[PV "foo\n"] s ->7
8           <0> unstack v ->4
-e syntax OK

$ perl -MO=Concise -e 'while(1) { print "foo\n" }'
a  <@> leave[1 ref] vKP/REFC ->(end)
1     <0> enter ->2
2     <;> nextstate(main 2 -e:1) v ->3
9     <2> leaveloop vK/2 ->a
3        <{> enterloop(next->8 last->9 redo->4) v ->4
-        <@> lineseq vK ->9
4           <;> nextstate(main 1 -e:1) v ->5
7           <@> print vK ->8
5              <0> pushmark s ->6
6              <$> const[PV "foo\n"] s ->7
8           <0> unstack v ->4
-e syntax OK

একইভাবে জিসিসিতে:

#include <stdio.h>

void t_while() {
    while(1)
        printf("foo\n");
}

void t_for() {
    for(;;)
        printf("foo\n");
}

    .file   "test.c"
    .section    .rodata
.LC0:
    .string "foo"
    .text
.globl t_while
    .type   t_while, @function
t_while:
.LFB2:
    pushq   %rbp
.LCFI0:
    movq    %rsp, %rbp
.LCFI1:
.L2:
    movl    $.LC0, %edi
    call    puts
    jmp .L2
.LFE2:
    .size   t_while, .-t_while
.globl t_for
    .type   t_for, @function
t_for:
.LFB3:
    pushq   %rbp
.LCFI2:
    movq    %rsp, %rbp
.LCFI3:
.L5:
    movl    $.LC0, %edi
    call    puts
    jmp .L5
.LFE3:
    .size   t_for, .-t_for
    .section    .eh_frame,"a",@progbits
.Lframe1:
    .long   .LECIE1-.LSCIE1
.LSCIE1:
    .long   0x0
    .byte   0x1
    .string "zR"
    .uleb128 0x1
    .sleb128 -8
    .byte   0x10
    .uleb128 0x1
    .byte   0x3
    .byte   0xc
    .uleb128 0x7
    .uleb128 0x8
    .byte   0x90
    .uleb128 0x1
    .align 8
.LECIE1:
.LSFDE1:
    .long   .LEFDE1-.LASFDE1
.LASFDE1:
    .long   .LASFDE1-.Lframe1
    .long   .LFB2
    .long   .LFE2-.LFB2
    .uleb128 0x0
    .byte   0x4
    .long   .LCFI0-.LFB2
    .byte   0xe
    .uleb128 0x10
    .byte   0x86
    .uleb128 0x2
    .byte   0x4
    .long   .LCFI1-.LCFI0
    .byte   0xd
    .uleb128 0x6
    .align 8
.LEFDE1:
.LSFDE3:
    .long   .LEFDE3-.LASFDE3
.LASFDE3:
    .long   .LASFDE3-.Lframe1
    .long   .LFB3
    .long   .LFE3-.LFB3
    .uleb128 0x0
    .byte   0x4
    .long   .LCFI2-.LFB3
    .byte   0xe
    .uleb128 0x10
    .byte   0x86
    .uleb128 0x2
    .byte   0x4
    .long   .LCFI3-.LCFI2
    .byte   0xd
    .uleb128 0x6
    .align 8
.LEFDE3:
    .ident  "GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3"
    .section    .note.GNU-stack,"",@progbits

সুতরাং আমি অনুমান করি উত্তরটি হ'ল, অনেক সংকলকগুলিতে সেগুলি একই। অবশ্যই, অন্য কিছু সংকলকগুলির ক্ষেত্রে এটি অগত্যা নাও হতে পারে, তবে সম্ভাবনাগুলি কি লুপের অভ্যন্তরের কোডটি যাইহোক লুপের থেকে কয়েক হাজার গুণ বেশি ব্যয়বহুল হয়ে উঠছে, সুতরাং কে যত্ন করে?


15
বি এর সাথে চেষ্টা করুন: ডিপার্স করুন, লুপের জন্য অসীমকে ছাড়িয়ে কিছুক্ষণের জন্য লুপ ফেরান: পি
কেন্ট ফ্রেড্রিক

27
"পার্লে, তারা একই অপকডগুলিতে ফল দেয়" ... হ্যাঁ, তবে কোনটি দ্রুত? :-)
টিন ম্যান

6
আমি প্রিন্টফের জন্য জিসিসি প্রতিস্থাপিত ()) রাখি পছন্দ করি, কারণ কেবলমাত্র একটি যুক্তি এবং তাই বিন্যাসে কিছুই নেই - দ্রুত এবং আরও সুরক্ষিত! (জিসিসি, ভেরিয়েবল আর্গুমেন্ট তালিকার বিপরীতে ট্যাগগুলির ফর্ম্যাটগুলিও চেক করে))
লি ডি

@ টিন ম্যান: তারা সমতুল্য, কারণ কম্পিউটারও ঠিক একই কাজ করে: পি
ব্ল্যাকবিয়ার

1
@ স্নাপ, এটি 'সম্পূর্ণরূপে' ভুল নয়, এটি কেবল রানটাইম ব্যয়ের উপর ফোকাস করছে। আপনার প্রোগ্রামটি কীভাবে দ্রুত চালিত হবে তার মূল সিদ্ধান্তের কারণ হিসাবে অসীম লুপগুলির পার্সিং সময়ের ফলে কী ধরণের পরিস্থিতি তৈরি হবে তা আমি কল্পনা করতে পারি না
বিডনলান

55

জিসিসি ব্যবহার করে, তারা উভয়ই একই সমাবেশ ভাষায় সংকলন করছে বলে মনে হচ্ছে:

L2:
        jmp     L2

20
-স বিকল্পের সাথে জিসিসি ব্যবহার (একত্র করুন, লিঙ্ক করবেন না)
মার্টিন কোট

54

একে অপরের চেয়ে বেশি পছন্দ করার মতো কারণ নেই। আমি মনে করি যে এটি while(1)এবং বিশেষত while(true)এর চেয়ে বেশি পঠনযোগ্য for(;;)তবে এটি কেবল আমার পছন্দ।


94
# নির্দিষ্ট সময় ;; (সর্বদা) জন্য আমি সর্বদা এই ধরণের মজাদার খুঁজে পেয়েছি।
টম

19
চিরকালই কীভাবে # ডিফাইন ((;;));
মার্টিন কোট

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

13
@ মার্টিন যা কাজ করবে না, কারণ # সংজ্ঞায়িত করা একটি টোকেনের মধ্যে প্রতিস্থাপন করে না, এবং foreverএটি নিজের টোকেন।
লিলি চুং

2
"আমি আমার রক্ষণাবেক্ষণের জন্য নতুন কীওয়ার্ডগুলি সংজ্ঞায়িত না করার চেষ্টা করি" - যদি আরও লোকেরা এই মনোভাব গ্রহণ করত তবে প্রতিবার আমি যখন ঘুরেছি তখন আমি এই সমস্ত বৌদ্ধ এবং যাদুকরী শাইটনিগানগুলিতে আঁকড়ে থাকব না!
tchrist

31

মান অনুযায়ী কোনও পার্থক্য নেই। 6.5.3 / 1 এর আছে:

বিবৃতি জন্য

for ( for-init-statement ; conditionopt ; expressionopt ) statement

সমতুল্য

{
  for-init-statement
  while ( condition ) {
    statement
    expression ;
  }
}

এবং 6.5.3 / 2 এর রয়েছে:

শর্ত এবং অভিব্যক্তি উভয়ই বাদ দেওয়া যেতে পারে। অনুপস্থিত শর্তটি বিহিত অবস্থায় ক্লজটিকে সময় (সত্য) এর সমান করে দেয়।

সুতরাং সি ++ স্ট্যান্ডার্ড কোড অনুসারে:

for (;;);

ঠিক যেমন:

{
  while (true) {
    ;
    ;
  }
}

4
এটি মোটামুটি উত্পন্ন কোড বা পারফরম্যান্সের সাথে সম্পর্কিত নয়। মান কেবল কার্যকারিতা সংজ্ঞায়িত করে। অবশ্যই পারফরম্যান্স একই হবে।
পোটোটোভটার

1
আমি বিশ্বাস করি না যে এটি সত্য যে পারফরম্যান্সে একটি পার্থক্য হ'ল বিধি লঙ্ঘন করে। যদি এটি হয়, তবে সংকলকগণ বিধি বিধি অনুযায়ী আপনার কোডটি গতি বাড়ানোর অনুমতি পাবে না, উদাহরণস্বরূপ স্বতন্ত্র বিবৃতি পুনরায় অর্ডার দিয়ে। সংকলকরা আসলে এটি করে। তবে আমার স্ট্যান্ডার্ডটির অনুলিপিটি বেশ উপরে is
স্টিভ জেসোপ

28

ভিজ্যুয়াল সি ++ সংকলক এর জন্য একটি সতর্কতা নির্গত করত

while (1) 

(ধ্রুবক প্রকাশ) কিন্তু জন্য নয়

for (;;)

আমি for (;;)সেই কারণে পছন্দ করার অনুশীলনটি চালিয়েছি , তবে এখনও জানি না যে সংকলকটি এখনও এই দিনগুলি করে does


সতর্কবার্তাটি সম্ভবত আপনি ব্যবহার করেছেন (1) পরিবর্তে (সত্য)
jrharshath

16
সত্য একটি ধ্রুবক। যদিও (সত্য) একটি ধ্রুবক অভিব্যক্তি। কেউ আগ্রহী জন্য, সতর্ক C4127 এখানে নথিভুক্ত হয়: msdn.microsoft.com/en-us/library/6t66728h(VS.80).aspx
শন ই

হ্যাঁ, সতর্কতাটি এখনও 1 এবং সত্য উভয়ের জন্যই উপস্থিত। এই কারণেই আমি সর্বদা (;;)
এলভিস স্ট্রেজডিন্স

26

for(;;) টাইপ করার জন্য একটি কম চরিত্র হ'ল যদি আপনি জিনিসগুলি অনুকূল করতে সেই দিকে যেতে চান।


21
গল্ফ করার জন্য জেনে রাখা ভাল। অন্যথায় একটি সিনট্যাক্স চয়ন করার একটি দুর্বল কারণ।
অ্যাডাম বেলায়ার

@ অ্যাডামবেলার টেরেন্সনেস প্রায়শই একটি নির্দিষ্ট দক্ষতার প্রান্তের উপরে পাঠযোগ্যতা বৃদ্ধি করে।
ভেক্টর গর্গোথ

20

এই পুরানো সংকলকগুলির সাথে টার্বো সি এর for(;;)পরে দ্রুত কোডের ফলাফল while(1)

আজ জিসিসি, ভিজ্যুয়াল সি (আমি প্রায় সমস্ত মনে করি) সংকলকগুলি ভালভাবে অনুকূলিত হয় এবং ৪.। মেগাহার্টজ সহ সিপিইউ খুব কম ব্যবহৃত হয়।

সেই দিনগুলিতে একটি for( i=10; i; i-- )দ্রুত ছিল for( i=1; i <=10; i++ ), কারণ তুলনা i0 হয়, এর ফলে সিপিইউ-জিরো-পতাকা শর্তযুক্ত জাম্প হয়। এবং শেষ হ্রাস ক্রিয়াকলাপের সাথে জিরো-ফ্ল্যাগটি সংশোধন করা হয়েছিল ( i-- ), কোনও অতিরিক্ত সিএমপি-অপারেশন প্রয়োজন নেই।

    call    __printf_chk
    decl    %ebx          %ebx=iterator i 
    jnz     .L2
    movl    -4(%ebp), %ebx
    leave

এবং এখানে for(i=1; i<=10; i++)অতিরিক্ত সিএমপিএল সহ:

    call    __printf_chk
    incl    %ebx
    cmpl    $11, %ebx
    jne     .L2
    movl    -4(%ebp), %ebx
    leave

13

সমস্ত লোক তর্ক আপনি যখন loops indefinte ব্যবহার করা উচিত নয় এবং অন্য কোনো হাবা কাপড় পরামর্শ খোলা ব্যবহার করার জন্য এতে যান 'গুলি (গম্ভীরভাবে, সেকি)

while (1) {
     last if( condition1 );
     code();
     more_code(); 
     last if( condition2 ); 
     even_more_code(); 
}

সত্যিই কার্যকরভাবে অন্য কোনও উপায়ে প্রতিনিধিত্ব করা যায় না। একটি প্রস্থান ভেরিয়েবল তৈরি করা এবং এটি সিঙ্ক করার জন্য কালো যাদু না করা নয়।

যদি আপনার আরও গোটো-এস্কু সিনট্যাক্সের জন্য কোনও ঝোঁক থাকে তবে এমন কিছু বুদ্ধিমান ব্যবহার করুন যা সুযোগকে সীমাবদ্ধ করে।

flow: { 

   if ( condition ){ 
      redo flow;
   }
   if ( othercondition ){ 
       redo flow;
   }
   if ( earlyexit ){ 
       last flow;
   }
   something(); # doesn't execute when earlyexit is true 
}

শেষ পর্যন্ত গতি ততটা গুরুত্বপূর্ণ নয়

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

সাধারণত এটি কীভাবে লুপ এবং কী

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

যদি আপনি কারোর উল্লিখিত "গ্যাটো লেবেল" কৌশলটি ব্যবহার করেন এবং আমাকে আপনার কোডটি ব্যবহার করতে হয় তবে এক চোখ খোলা রেখে ঘুমাতে প্রস্তুত থাকুন, বিশেষত আপনি যদি একবারের বেশি করে থাকেন তবে এই ধরণের জিনিস ভয়াবহভাবে তৈরি করে স্টাফগুলি স্প্যাগেটি কোড ।

আপনি স্প্যাগেটি কোড তৈরি করতে পারবেন তার অর্থ এই নয় যে আপনার উচিত


9

স্ট্রাস্ট্রাপ থেকে, টিসি ++ পিএল (তৃতীয় সংস্করণ), §6.1.1:

কৌতূহলী স্বরলিপি for (;;)একটি অসীম লুপ নির্দিষ্ট করার মানক উপায়; আপনি এটি "চিরকাল" উচ্চারণ করতে পারেন could [...] while (true)একটি বিকল্প।

আমি পছন্দ for (;;)


9

সংকলক যদি কোনও অপ্টিমাইজেশন না করে for(;;)তবে সর্বদা তার চেয়ে দ্রুত হবেwhile(true) । এর কারণ হ'ল বিবৃতিটি প্রতিবার শর্তটি মূল্যায়ন করে, তবে বিবৃতিটি একটি নিঃশর্ত জাম্প। তবে যদি সংকলক নিয়ন্ত্রণ প্রবাহটিকে অনুকূলিত করে, তবে এটি কিছু অপকড তৈরি করতে পারে। আপনি খুব সহজেই ডিসসোয়্যাস কোডটি পড়তে পারেন।

পিএস আপনি এই মত একটি অসীম লুপ লিখতে পারে:

#define EVER ;;
  //...
  for (EVER) {
    //...
  }

আধুনিক যুগে এবং যুগে কখনও EVS (কিশোরী বক্তৃতা) দিয়ে প্রতিস্থাপন করা উচিত নয়! গুরুতরভাবে যদিও আমি কেবল (;;) for} এর জন্য ব্যবহার করি} দুজনের মধ্যে পার্থক্য সম্পর্কে আমি দীর্ঘদিন আগে অনলাইনে পড়েছিলাম (যখন আমি ছোট ছিলাম এবং আসলে জানতাম না যে তারা একই রকম) এবং আমি যা পড়েছি তা কেবল আটকে রেখেছি।
Bja

8

আমি এই সম্পর্কে একবার শুনেছি।

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


5

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


3

আমি অবাক হই যে পার্লের for (;;)তুলনায় কেউ সঠিকভাবে পরীক্ষা করে নি while (1)!

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

ভাগ্যক্রমে পার্লের একটি সুবিধাজনক বেঞ্চমার্ক মডিউল রয়েছে যা আমরা নিম্নরূপ একটি মানদণ্ড বাস্তবায়নের জন্য ব্যবহার করতে পারি:

#!/usr/bin/perl -w

use Benchmark qw( cmpthese );

sub t_for   { eval 'die; for (;;) { }'; }
sub t_for2  { eval 'die; for (;;)  { }'; }
sub t_while { eval 'die; while (1) { }'; }

cmpthese(-60, { for => \&t_for, for2 => \&t_for2, while => \&t_while });

নোট করুন যে আমি লুপের জন্য অসীমের দুটি পৃথক সংস্করণ পরীক্ষা করছি: একটি যা লুপের চেয়ে কম এবং অন্যটি যেখানে লুপের মতো একই দৈর্ঘ্য তৈরি করতে অতিরিক্ত স্থান রয়েছে।

পার্ল 5.10.1 সহ উবুন্টু 11.04 x86_64 এ আমি নিম্নলিখিত ফলাফলগুলি পেয়েছি:

          For2 জন্য রেট
100588 / s - -0% -2% এর জন্য
for2 100937 / s 0% - -1%
যখন 102147 / গুলি 2% 1% -

এই প্ল্যাটফর্মের সময় লুপটি স্পষ্টভাবে বিজয়ী।

পার্ল 5.14.1 সহ ফ্রিবিএসডি 8.2 x86_64 এ:

         For2 জন্য রেট
53453 / s - -0% -2% এর জন্য
for2 53552 / s 0% - -2%
যখন 54564 / গুলি 2% 2% -

যদিও লুপটি এখানেও বিজয়ী।

পার্ল 5.14.1 সহ ফ্রিবিএসডি 8.2 আই 386:

         For2 এর জন্য রেট দিন
24311 / s - -1% -1%
24481 / গুলি 1% - -1% এর জন্য
for2 24637 / s 1% 1% -

আশ্চর্যজনকভাবে অতিরিক্ত স্থান সহ লুপের জন্য এখানে দ্রুততম পছন্দ!

আমার উপসংহারটি হ'ল যদি প্রোগ্রামার গতির জন্য অনুকূলিত হয় তবে লুপটি x86_64 প্ল্যাটফর্মে ব্যবহার করা উচিত। স্পেসের জন্য অনুকূলকরণের জন্য অবশ্যই একটি লুপ ব্যবহার করা উচিত। আমার ফলাফলগুলি দুর্ভাগ্যক্রমে অন্যান্য প্ল্যাটফর্মগুলির সাথে সম্পর্কিত।


9
উপসংহারটি স্পষ্টতই ভুল। Benchmarkএর সীমাবদ্ধতা রয়েছে এবং ফলাফলগুলি একে অপরের%% এর মধ্যে থাকলে ধীর থেকে দ্রুত পার্থক্য করতে ব্যবহার করা যাবে না। তাছাড়া, আপনি মধ্যে পার্থক্য পরীক্ষাও দেইনি কয়েকটা forএবং whileলুপ কারণ প্রতিটি সাব হবে dieসামনে লুপ নিজেদের পৌঁছনো। এবং কখন থেকে পার্ল ইন্টারপ্রেটারের সাথে শ্বেত স্পেসের পরিমাণ ছিল? দুঃখিত, তবে বিশ্লেষণ অত্যন্ত ত্রুটিযুক্ত।
জায়েদ

2
@ জায়েদ, আপনার মন্তব্যের জন্য ধন্যবাদ! আপনার নিজের উত্তর পোস্ট করার বিষয়ে কি আপত্তি হবে যাতে সবাই সেখান থেকে শিখতে পারে? :) dieআমার কোডটি এখানে আছে কারণ আমার উদ্দেশ্যটি কেবল সংকলনের সময়ের পার্থক্য পরীক্ষা করা । যেহেতু অন্যরা ইতিমধ্যে চিহ্নিত করেছেন যে ফলাফলগুলি বাইট-কোডটি অভিন্ন, সুতরাং এটি পরীক্ষা করার কোনও মানে নেই। আশ্চর্যজনকভাবে আমার পরীক্ষার পরিবেশগুলিতে সাদা জায়গার পরিমাণ এই ক্ষেত্রে সামান্যতম পার্থক্য মনে করছে। চরিত্রগুলি কীভাবে স্মৃতিতে বা
স্ন্যাপ করুন

4
আমার কোনও উত্তর পোস্ট করার দরকার নেই কারণ আমি যা বলব তা ইতিমধ্যে বিডনলান উল্লেখ করেছেন। এমনকি আপনি সংকলনের সময়গুলির সাথে তুলনা করলেও যে সংখ্যাগুলি Benchmarkবেঁধে দেওয়া হয়। 1% পার্থক্য মোটেই বিশ্বাস করবেন না!
জায়েদ

শুধুমাত্র 60 পুনরাবৃত্তি? 5 মিনিটের মতো পরীক্ষা চালান যাতে আপেক্ষিক সময়গুলি আরও সঠিক হয়।
হাঁসটি

-6060 সেকেন্ডের জন্য পরীক্ষা চালায়।
স্ন্যাপ করুন

2

তত্ত্ব অনুসারে, ক সম্পূর্ণ নিখুঁত সংকলক বাইনারি (স্পেস নষ্ট) এর আক্ষরিক '1' সংরক্ষণ করতে পারে এবং প্রতি পুনরাবৃত্তিতে 1 == 0 (সময় এবং আরও বেশি জায়গার অপচয় করা) কিনা তা পরীক্ষা করে দেখতে পারে।

বাস্তবে, যাইহোক, এমনকি "না" অপ্টিমাইজেশন থাকা সত্ত্বেও, সংকলকগুলি উভয়কে একই হিসাবে কমিয়ে দেবে। তারা সতর্কতাও নির্গত করতে পারে কারণ এটি একটি যৌক্তিক ত্রুটি নির্দেশ করতে পারে। উদাহরণস্বরূপ, যুক্তি whileঅন্য কোথাও সংজ্ঞায়িত করা যেতে পারে এবং আপনি বুঝতে পারবেন না এটি স্থির।


2

আমি আশ্চর্য হয়েছি যে কাঙ্ক্ষিত সমাবেশের সাথে মিলিয়ে কেউ আরও সরাসরি ফর্ম সরবরাহ করে নি:

forever:
     do stuff;
     goto forever;

ডোজ যা 1 বা (;;) এর জন্য সি হিসাবে মেশিন কোডের সাথে শেষ হয় না?
কোপাস

1
এই পদ্ধতির অপর একটি ঘাটতি: এটি কোনও ব্লকে লুপটি আবদ্ধ না করে এনক্যাপসুলেশন লঙ্ঘন করে - সুতরাং লুপে ঘোষিত কোনও ভেরিয়েবল লুপের বাইরে উপলব্ধ। (অবশ্যই, আপনি পারতেন { forever: do stuff; goto forever; })
রায় টিঙ্কার

2

while(1)একটি প্রতিমা for(;;)যার জন্য বেশিরভাগ সংকলক দ্বারা স্বীকৃত।

আমি পার্লকেও চিনতে পেরে আনন্দিত হয়েছিল until(0)


(0) সাহায্যকারী না হওয়া পর্যন্ত কোন পরিস্থিতিতে থাকবে?
কোপাস

3
() যখন () এর বিপরীত হয় ঠিক ততক্ষণ (যদি না) যদি () এর বিপরীত হয়। এই থ্রেডের পুরো জায়গাতেই পরামর্শ দেওয়া হয়েছে যে কেউ লিখতে পারেন: কিছু করুন ... কিছু করুন} যখন (! শর্ত) বিকল্প হতে পারে (শর্ত) {কিছু until
জেএমডি

2

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


2

এই থ্রেডটি জুড়ে এসেছিল (যদিও বেশ কয়েক বছর দেরিতে)।

আমি মনে করি যে "((;;))" "(") "এর চেয়ে" কেন ভাল "এর আসল কারণটি খুঁজে পেয়েছি।

"ব্যার কোডিং স্ট্যান্ডার্ড 2018" অনুসারে

Kernighan & Ritchie long ago recommended for (;;) , which has the additional benefit
of insuring against the visually-confusing defect of a while (l); referencing a variable l’.

মূলত, এটি কোনও গতির সমস্যা নয় তবে একটি পঠনযোগ্যতার সমস্যা। কোডের ফন্ট / মুদ্রণের উপর নির্ভর করে কিছুক্ষণের মধ্যে এক (1) ছোট হাতের অক্ষরের মতো দেখতে লাগবে l।

অর্থাৎ 1 বনাম এল। (কিছু ফন্টে এগুলি দেখতে অভিন্ন)।

সুতরাং যখন (1) কিছু পরিবর্তনশীল লেটার এল এর উপর নির্ভর করে লুপ হতে পারে।

(সত্য) কাজ করতে পারে তবে কিছু পুরানো সি এবং এম্বেড থাকা সি ক্ষেত্রে সত্য / মিথ্যা এখনও সংজ্ঞায়িত করা হয় যদি না stdbool.h অন্তর্ভুক্ত না করা হয়।


2
আমি বলব আপনার কোডটিতে ইস্যুটি হ'ল আপনার নামের একটি ভেরিয়েবল আছে l, এটি নয় 1এবং lএকইরকম দেখতে পারেন।
mjuopperi

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

-3

আমি ভাবব পারফরম্যান্সের ক্ষেত্রে উভয়ই এক রকম। তবে আমি পঠনযোগ্যতার জন্য (1) থাকাকালীন পছন্দ করব তবে কেন আপনাকে অনন্ত লুপের প্রয়োজন তা আমি প্রশ্ন করি।


-14

তারা একই. চিন্তা করার জন্য আরও অনেক গুরুত্বপূর্ণ প্রশ্ন রয়েছে।


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


22
কোনও লিঙ্ক বা ব্যাখ্যা নেই। অপ্রয়োজনীয়, সাবজেক্টিভ এবং কিছুটা সম্মোহক।
সিডিএমকেই

1
ভাল কোন প্রমাণ কিন্তু তিনি সঠিক। দুজনেই মিথ্যা হলে জাম্পিংয়ের জন্য ওপকোডকে কল করে। (যা এটিকে গোটোর মতো করে তুলবে তবে গোটো পছন্দ করে না)
ম্যাথু হোয়াইট

3
আমি জানি না যে শুধুমাত্র গুরুত্বপূর্ণ প্রশ্নগুলি কোথায় জিজ্ঞাসা করা উচিত, আমার ভুলটি আমার প্রথম প্রশ্ন।
কোপাস

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

8
আমি বোকা হওয়ার চেষ্টা করছিলাম না। আমি একটা কথা বলার চেষ্টা করছিলাম। আমি যখন এটি পোস্ট করেছি তখন আমি এক ধরণের অন্ধকার রসিকতার চেষ্টা করছিলাম, এবং এটি স্পষ্ট যে আমি ব্যর্থ হয়েছি; তার জন্য আমি ক্ষমা চেয়ে নিচ্ছি।
মার্ক রান্সম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.