2017-01-03 8 views
0

我々はメモリ内だけで1バイトある文字ではないので、私はこれを聞いてるのよ範囲ベースのforループですが、どちらが速いのですか?

for (auto const & c : s) 

for (auto c : s) 

// c => char 
// s => std::string 

上で使用して範囲ベースの文字列でループのために、そこにある任意のゲインを使用している場合それはコピーするには高価で、これは昨夜私が好奇心を保った。

私はいくつかのベンチマークを行いました。

結果:

// In Milliseconds 

// 1000 
// BY COPY: 7 
// BY _REF: 5 

// 10000 
// BY COPY: 51 
// BY _REF: 50 

// 100000 
// BY COPY: 503 
// BY _REF: 501 

// 1000000 
// BY COPY: 5047 
// BY _REF: 5101 

// 10000000 
// BY COPY: 52058 
// BY _REF: 56160 

CODE:好奇心のうち

#include <chrono> 
#include <iostream> 
#include <string> 

using std::cout; 
using std::endl; 

bool by_copy(std::string const & s); 
bool by_const_ref(std::string const & s); 

int main() { 
    std::string const test {"0000000001"}; 

    auto start {std::chrono::steady_clock::now()}; 
    for (unsigned long long i {}; i < 10000000; ++i) { 
     bool b {by_copy(test)}; 
     if (b) {} 
    } 
    auto end {std::chrono::steady_clock::now()}; 
    auto duration {std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count()}; 
    cout << "BY COPY: " << duration << '\n'; 

    start = std::chrono::steady_clock::now(); 
    for (unsigned long long i {}; i < 10000000; ++i) { 
     bool b {by_const_ref(test)}; 
     if (b) {} 
    } 
    end = std::chrono::steady_clock::now(); 
    duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count(); 
    cout << "BY _REF: " << duration << '\n'; 

    return 0; 
} 

bool by_copy(std::string const & s) { 
    for (auto c : s) { 
     if (c == '1') { 
      return true; 
     } 
    } 
    return false; 
} 

bool by_const_ref(std::string const & s) { 
    for (auto const & c : s) { 
     if (c == '1') { 
      return true; 
     } 
    } 
    return false; 
} 

UPDATE、私はまた、インデックスでのベンチマークではなかった、それは多くの方法でした範囲ベースのforループよりも速く、なぜですか?

結果

// 1000 
    // BY COPY: 7 
    // BY _REF: 5 
    // BYINDEX: 4 

    // 10000 
    // BY COPY: 59 
    // BY _REF: 58 
    // BYINDEX: 37 

    // 100000 
    // BY COPY: 526 
    // BY _REF: 495 
    // BYINDEX: 326 

    // 1000000 
    // BY COPY: 5751 
    // BY _REF: 5038 
    // BYINDEX: 3308 

    // 10000000 
    // BY COPY: 62202 
    // BY _REF: 63002 
    // BYINDEX: 38744 

by_index機能:明確にするために

bool by_index(std::string const & s) { 
    for (size_t i {}; i < s.size(); ++i) { 
     if (s[i] == '1') { 
      return true; 
     } 
    } 
    return false; 
} 
+6

違いを測定すると、何が見つかりましたか? –

+3

@KerrekSB測定労力のない質問が測定に送られ、測定努力で質問が送信されるのは、その測定値が無意味であり、分解のみが重要であると言われています:) – Rotem

+0

私はそれをまだ測定していません。 –

答えて

1

、私はあなたが文字列の文字を反復していることをあなたの質問は、このような解釈 - というよりもAを反復弦のコンテナ。

いいえ、利点はありません。実際、暗黙の間接指定のために参照が遅くなるという理論的な可能性があります。しかし、まともなオプティマイザがその迂回を避けることができるので、両方のバリエーションがまったく同じマシンコードにコンパイルされる可能性があります。

+0

最初のケースではないのに、2番目のケースでは文字列コンストラクタの呼び出しがありませんか? –

+0

@RawN 's'が文字列なら' c'は文字です。そこにコンストラクタはありません。 – NathanOliver

+0

@RawNいいえ、いずれの場合も文字列は作成されません。 – user2079303

関連する問題