ホームページ > バックエンド開発 > C++ > 正確なタイミング測定のために C でステートメントの実行順序を保証するにはどうすればよいですか?

正確なタイミング測定のために C でステートメントの実行順序を保証するにはどうすればよいですか?

DDD
リリース: 2024-11-30 00:11:14
オリジナル
129 人が閲覧しました

How Can I Guarantee Statement Execution Order in C   for Accurate Timing Measurements?

C でのステートメントの順序の強制

並べ替えに関する懸念

C コードでは、最適化フラグを使用するとステートメントの並べ替えが発生する可能性があり、正確性に関する懸念が生じます実行命令。コンパイラの最適化と、それがステートメントのシーケンスにどのような影響を与えるかを理解することが重要です。

バリアを使用してステートメントの順序を強制する

残念ながら、C にはステートメントの順序を直接強制する組み込みメカニズムがありません。コンパイラーは、確立された操作セマンティクスと、整数加算などの操作による観察可能な影響がないことを考慮して、最適化中に命令を自由に並べ替えることができます。

タイミング測定の代替手法

正確なタイミング測定については、次のことをお勧めします。次のような特殊なテクニックを使用します:

  • データ挟み込み: タイミングを測定するコードを不透明なデータ マーカーで囲むことにより、コンパイラの最適化を防ぎます。
  • マイクロ ベンチマーク ライブラリ: これらの手法を採用して信頼性の高いタイミングを提供する Google のベンチマークのようなライブラリを利用します。測定。

データ挟み込み例

関数 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート