したがって、イテレーターに関する前の例、VS 2005、4回実行されます。 マシンが完全にアンロードされ、トレントなどがバックグラウンドで実行されていません。winampがオフになっている場合でも。 (ちなみに、CPUにバインドされたワークロードの場合、Winampおよびトレントでさえ、最大1〜2%の大きなジッターを作成しません。)結果は0.758から1.085になり、ほぼ1.5倍になります。 異なる走行で、また、異なる勝利で、これはレースには受け入れられません。 ;)
x = 3256681784 iterator++. Total time : 0.795557 
      
        
        
        
      
     x = 3256681784 ++iterator. Total time : 0.892076 
      
        
        
        
      
     
      
        
        
        
      
     x = 3256681784 iterator++. Total time : 1.08741 
      
        
        
        
      
     x = 3256681784 ++iterator. Total time : 1.0848 
      
        
        
        
      
     
      
        
        
        
      
     x = 3256681784 iterator++. Total time : 0.898355 
      
        
        
        
      
     x = 3256681784 ++iterator. Total time : 0.758123 
      
        
        
        
      
     
      
        
        
        
      
     x = 3256681784 iterator++. Total time : 0.906159 
      
        
        
        
      
     x = 3256681784 ++iterator. Total time : 0.861794
      
      元気? コードを見ると、QPCがあり、その前にSetThreadAffinityMaskがあります。 反逆、本部は私たちのものではありません。 C2Dプロセッサ。異なるコアで異なる周波数を維持できます。 また、ダウンタイム時には、OSはこれを利用して頻度を減らします。 一方のコアでタイマー(QueryPerformanceFrequency)を調整し、もう一方のコアまたは同じコアでカウンターデータ(QueryPerformanceCounter)を読み取りますが、頻度を増やした後にゴミが発生します。
SetThreadAffinityMaskで1文字を正確に変更し、2番目のパラメーターを0ではなく1に設定します。
x = 3256681784 iterator++. Total time : 0.751778 
      
        
        
        
      
     x = 3256681784 ++iterator. Total time : 0.685859 
      
        
        
        
      
     
      
        
        
        
      
     x = 3256681784 iterator++. Total time : 0.737615 
      
        
        
        
      
     x = 3256681784 ++iterator. Total time : 0.686026 
      
        
        
        
      
     
      
        
        
        
      
     x = 3256681784 iterator++. Total time : 0.736503 
      
        
        
        
      
     x = 3256681784 ++iterator. Total time : 0.688713 
      
        
        
        
      
     
      
        
        
        
      
     x = 3256681784 iterator++. Total time : 0.772983 
      
        
        
        
      
     x = 3256681784 ++iterator. Total time : 0.68895
      
      はるかに良い。 最初のテストは、0.736から0.772に震えています。 50%ではなく5%ずつ。 0.686から0.689までの2番目、それら。 0.4%。 違いはどこから来ますか?
仮説。 2番目のテストが開始されるまでに、キャッシュは熱くなります。 コードを注意深く読みました。 ただし、5000回の実行があり、コールドキャッシュは最初のもののみを変更します。 仮説は正しくありません。
仮説。 最初のテストが最初です。 おそらく、コア周波数の増加はそのプロセスで発生します。 さて、すべてのテストの前にプロセッサを温めましょう。 コンパイラーは非常に賢く、定数、特に使用されていない定数の計算と最適化に努めているため、volatileマジック修飾子を思い出します。 リビルド、おっと、助けにはならなかった。 親和性について覚えておいてください。 タイミングを合わせたピースだけでなく、プロセス全体を1つのコアに打ち破ります(そうしないと、間違ったコアを加熱する危険性があります)。 リビルド、おっと、勝利! このような4行のプログラムの最初に置いた合計。
  SetProcessAffinityMask(GetCurrentProcess(), 1); volatile int zomg = 1; for ( int i=1; i<1000000000; i++ ) zomg *= i;
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
      
      そして結果を楽しんでください。
x = 3256681784 iterator++. Total time : 0.687585 
      
        
        
        
      
     x = 3256681784 ++iterator. Total time : 0.685685 
      
        
        
        
      
     
      
        
        
        
      
     x = 3256681784 iterator++. Total time : 0.687524 
      
        
        
        
      
     x = 3256681784 ++iterator. Total time : 0.68579 
      
        
        
        
      
     
      
        
        
        
      
     x = 3256681784 iterator++. Total time : 0.686004 
      
        
        
        
      
     x = 3256681784 ++iterator. Total time : 0.688326 
      
        
        
        
      
     
      
        
        
        
      
     x = 3256681784 iterator++. Total time : 0.688472 
      
        
        
        
      
     x = 3256681784 ++iterator. Total time : 0.685775
      
      ビンゴ ジッタは1%未満であり、これは非常に正常です。 そして今、最後に、違いはありません。 実際には、理論上そうあるべきです。 (このリリースでは、両方のイテレーターはポインターウォークで展開する必要があります。もちろん、SECURE_SCLをオンにしたデバッグでは、イスラエルの要素で地獄に陥ります。)
Linuxでは、パフォーマンスガバナーと呼ばれるまったく同じ問題が発生します。 ガバナーをパフォーマンスのようなものに切り替えるだけでなく、アフィニティゲームなどのウォームアップも役立ちます。
あなたにぴったりのベンチマーク。