2017-09-22 7 views
0

アルゴリズムやパフォーマンスベンチマーキングについては比較的新しいですが、いくつか質問があります。C#アルゴリズムのパフォーマンスの変動

私は、すでに必要なプロセスループの中断を制限するために、小さな繰り返しで処理できるアルゴリズムを作成しました。私の目標は1ミリ秒以下で処理することでしたので、かなり一貫したパフォーマンスを持つことが非常に重要と思われます。

残念なことに、アルゴリズムを0.5msに平均化するためにプロセスウェイトを適用した後、私は時々20ms以上の時間を達成しました。私は、データ収集によっていくつかの問題が発生することに気付きました(私はそれがメモリ内で動いていると仮定しています)。私はそれ以来解決していますが、パフォーマンスの変動はまだあります。

ここで空白のメソッドを作成しました。ここでも私はこれらの時折高い時を得ます。

public void DoTask() 
    { 
     for (int i = 0; i < 100000; i++) 
     { 
      //do nothing 
     } 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     DoTask(); //burn 

     var watch = new Stopwatch(); 
     watch.Start(); 

     double time; 
     for (int j = 0; j < 20; j++) 
     { 
      for (int i = 0; i < 1000; i++) 
      {     
       time = watch.ElapsedTicks; 

       DoTask(); 

       time = watch.ElapsedTicks - time; 

       LongestTime = Math.Max(LongestTime, time); 

       TotalTime += time; 

       Count++; 
      } 
      double avgTime = TotalTime/Count; 

      MessageBox.Show($"Longest time: {ToMs(LongestTime).ToString("#.##")} Avg time: {ToMs(avgTime).ToString("#.##")}"); 
      TotalTime = 0; 
      Count = 0; 
      LongestTime = 0; 
     } 
    } 

最長時間:13.04平均時間:0.01これが起こることを引き起こしている何

?それは私がコントロールできないものですか?

ありがとうございました。

+0

.NETアプリケーションでは、確定的な実行時間を保証することはできません。あなたがコントロールできないガベージコレクタがあります。 .NETは「ハードリアルタイム」アプリケーションには適していません。 – dymanoid

+0

DoTask()はポストにあります。何もしません。 –

+0

また、マルチタスクOSに取り組んでいることを忘れないでください。そうすれば、他のプログラムがCPU時間を稼いでいる間にあなたの計算が保留になる可能性は非常に高いです。 – fvu

答えて

1

これは実際にはWindowsの問題(またはマルチタスクをサポートするオペレーティングシステムではありますが、すべてのコンシューマOSを対象としたリアルタイムOSではありません)です。すべての通常のマルチタスク・オペレーティング・システムでは、各スレッドは、指定されたスレッドが中断なく実行され、潜在的に別のスレッドに切り替わる時間を与えます。ステップの実行が中断されて、Stopwatchで測定された他のスレッド時間を優先すると、スレッドが実行を継続するのに要する時間の長さになります(Windowsではデフォルトで15ms)。

測定時間は正確には困難な作業であり、一般的に特殊なツール(プロファイラー)に任せておくのがより効果的です。

をわずかににするには、インプロセスタイマだけでより一貫した測定を行います。コードを実行するスレッドの優先順位を上げます。そうすれば、スレッドは他のスレッドを優先して中断される可能性が低くなります。

注:

  • リアルタイム・オペレーティング・システムは、一般に非中断し、実行時間を保証するためのコードを実行するから、いくつかの協力が必要です。また、C#をサポートしているOSはないと思います。
  • MS DOSのような非マルチタスクOSであっても、OSがデバイス(ディスク、キーボード、タイマー)からの割り込みを処理しなければならないので、同様のランダムな時間変動を見ることができます。割り込み処理コードの持続時間(通常は小さな時間ですが、問題はまだあります)。
  • .Netコードは、任意の時点(すなわち、別のスレッド上の割り当てによる)で発生する可能性のあるガベージコレクションを実行しなければならないため、いくつかの追加の懸念を追加する。詳細情報Fundamentals of Garbage Collection
+0

本当に有益です。ありがとう。 –

関連する問題