C コードでは、最適化フラグを使用するとステートメントの並べ替えが発生する可能性があり、正確性に関する懸念が生じます実行命令。コンパイラの最適化と、それがステートメントのシーケンスにどのような影響を与えるかを理解することが重要です。
残念ながら、C にはステートメントの順序を直接強制する組み込みメカニズムがありません。コンパイラーは、確立された操作セマンティクスと、整数加算などの操作による観察可能な影響がないことを考慮して、最適化中に命令を自由に並べ替えることができます。
正確なタイミング測定については、次のことをお勧めします。次のような特殊なテクニックを使用します:
関数 foo の実行時間を測定することが目的である次の例を考えてみましょう:
using Clock = std::chrono::high_resolution_clock; auto t1 = Clock::now(); // Statement 1 auto output = foo(input); // Statement 2 auto t2 = Clock::now(); // Statement 3 auto elapsedTime = t2 - t1;
データ挟み込み手法を使用して、特定の計算が確実に残るようにコードを変更できます。測定された時間間隔内:
auto input = 42; auto t1 = Clock::now(); // Statement 1 DoNotOptimize(input); auto output = foo(input); // Statement 2 DoNotOptimize(output); auto t2 = Clock::now(); // Statement 3 return t2 - t1;
ここで、DoNotOptimize は入力データと出力データを次のようにマークします。最適化できないため、コンパイラによる削除や並べ替えができなくなります。これにより、コンパイラーの最適化にもかかわらず、目的の計算の正確なタイミングが保証されます。
以上が正確なタイミング測定のために C でステートメントの実行順序を保証するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。