2017-05-04 9 views
1

私は楽しいためにLeetCodeチャレンジ(here)を行っていましたが、whileループがforループよりも効率的だったことに驚いていました。コンパイラが同じコードを生成することを期待していたでしょう(question and answersも同じですが)実行時間が異なります。Whileループはforループより効率的です。理由は何でしょうか?

forループは約3msでしたが、forループは約6msでした。私は数回繰り返しました。それはしばしばそのように思えます。

残念ながら、私はテストケースを持っていないし、使用されているコンパイラ、アーキテクチャまたは最適化の設定に関する情報はありません。私は、プログラムがほぼ同じで、同じコンパイラ、アーキテクチャ、オプションを確実に使用するので、重要ではないと思います。

その点に関するアイディアや経験はありますか? Forループ

vector<int> twoSum(vector<int>& numbers, int target) { 
    int upper = numbers.size() - 1; 
    int lower = 0; 
    int sum; 

    while (lower<upper) { 
     sum = numbers[lower] + numbers[upper]; 
     if (sum == target) { 
      return vector<int> { lower+1, upper+1 }; 
     } else if (sum > target) { 
      upper--; 
     } else { 
      lower++; 
     } 
    } 
} 
+1

[mcve]を作成します。 – user2079303

+3

奇妙な;コード生成が本当に悪く、最適化がオフになっていない限り、それを行う理由を考えることができません –

+1

ループを何回実行しましたか?最適化されましたか?マイクロベンチマーキングは非常に難しいことがあります。 – NathanOliver

答えて

0

すべてのループは、同じテンプレートに従ってください:

vector<int> twoSum(vector<int>& numbers, int target) { 
    int upper = numbers.size() - 1; 
    int lower = 0; 
    int sum; 

    for (;lower<upper;) { 
     sum = numbers[lower] + numbers[upper]; 
     if (sum == target) { 
      return vector<int> { lower+1, upper+1 }; 
     } else if (sum > target) { 
      upper--; 
     } else { 
      lower++; 
     } 
    } 
} 

ループしながら

{ 
// Initialize 
LOOP: 
if(!(/* Condition */)) { 
    goto END 
} 

// Loop body 

// Loop increment/decrement 
goto LOOP 
} 
END: 

あなたのテストは、あなたに利用可能な処理能力によって異なっている必要がありますCPU。

+0

私は条件の否定を避けるでしょう、それは不要です。 – Jonas

+0

否定が存在しない場合、あなたのC++のコード化された条件は、想定されていたものとは反対になります。これはC++のフードの下にあります –

+0

これは私が意味するものではありません。私はifステートメントを単にconditionをチェックするように変更し、ifボディにループボディ、インクリメントステップ、およびgo-toループが含まれるようにします。 – Jonas

4

十分な長さのテストを実行していないため、ベンチマークのミリ秒単位の検証が困難です。

より良い方法は、生成されたアセンブリ:for-loopwhile-loopを比較することです。 スニペットは、g ++ 6.3を使用して最大限の最適化(-O3)でコンパイルされます。 2つのアセンブリがまったく同じなので、パフォーマンスの差はまったくないことは明らかです。

関連する問題