私はまったくの初心者ですが、C# で文字列を処理する小さなプログラムを書いていて、いくつかのことを別の方法で行うと、コードの実行速度が大幅に速くなることに気付きました。
コードの実行速度を計るにはどうすればよいのでしょうか。(無料の)ユーティリティはありますか?System.Timer を使用して昔ながらの方法でそれを自分で行いますか?
私はまったくの初心者ですが、C# で文字列を処理する小さなプログラムを書いていて、いくつかのことを別の方法で行うと、コードの実行速度が大幅に速くなることに気付きました。
コードの実行速度を計るにはどうすればよいのでしょうか。(無料の)ユーティリティはありますか?System.Timer を使用して昔ながらの方法でそれを自分で行いますか?
あなたが説明していることは、パフォーマンスプロファイリングとして知られています。JetbrainsプロファイラーやAntsプロファイラーなど、これを実行できるプログラムはたくさんありますが、ほとんどの場合、パフォーマンスの測定中にアプリケーションの速度が低下します。
独自のパフォーマンスプロファイリングを手動でロールするには、説明したように、 System.Diagnostics.Stopwatchと単純なConsole.WriteLineを使用できます。
また、C#JITコンパイラは、呼び出されるタイプと頻度に応じてコードを最適化するため、再帰呼び出しなど、さまざまなサイズとメソッドのループを試して、何が最適かを把握してください。
RedGateのANTSプロファイラーは本当に素晴らしいパフォーマンスプロファイラーです。JetBrainsのdotTraceProfilerも素晴らしいです。これらのツールを使用すると、個々の行をドリルダウンできるパフォーマンスメトリックを確認できます。
ANTSプロファイラーのスクリーショット: ANTS http://www.red-gate.com/products/ants_profiler/images/app/timeline_calltree3.gif
単体テスト中に特定のメソッドが特定のパフォーマンスしきい値内にとどまるようにしたい場合は、Stopwatch
クラスを使用して、ループ内でメソッドの実行時間を1回監視し、平均を計算しAssert
てから結果に対して計算します。
注意点 - Debug ではなく Relase でコンパイルしてください。(経験豊富な開発者が犯したこの間違いを見てきました - 忘れがちです)。
あなたが説明しているのは「パフォーマンスチューニング」です。パフォーマンス チューニングについて話すとき、それには 2 つの角度があります。(a) 応答時間 - 特定の要求/プログラムの実行にかかる時間。(b) スループット - 1 秒間に実行できるリクエストの数。通常「最適化」すると、不必要な処理を排除すると、応答時間とスループットの両方が向上します。ただし、コードに待機イベント (Thread.sleep()、I/O 待機など) がある場合、応答時間は影響を受けますが、スループットは影響を受けません。並列処理 (複数のスレッドの生成) を採用することで、応答時間は改善されますが、スループットは改善されません。通常、サーバー側アプリケーションでは、応答時間とスループットの両方が重要です。デスクトップ アプリケーション (IDE など) の場合、スループットは重要ではなく、応答時間のみが重要です。
「パフォーマンス テスト」によって応答時間を測定できます。すべての主要なトランザクションの応答時間を書き留めるだけです。「負荷テスト」でスループットを測定できます。サーバー マシンの CPU 使用率が 80 ~ 90% になるように、十分な数のスレッド/クライアントから継続的に要求を送信する必要があります。リクエストを送信するとき、異なるトランザクション間の比率 (トランザクション ミックスと呼ばれます) を維持する必要があります。たとえば、予約システムでは、100 件の検索ごとに 10 件の予約が行われます。10回の予約ごとに1回のキャンセルがあります。
応答時間の調整が必要なトランザクションを特定したら (パフォーマンス テスト)、プロファイラーを使用してホット スポットを特定できます。応答時間 * そのトランザクションの割合を比較することで、スループットのホット スポットを特定できます。検索、予約、キャンセルのシナリオでは、比率が 89:10:1 であると仮定します。応答時間は 0.1 秒、10 秒、15 秒です。検索の負荷 - 0.1 * .89 = 0.089 予約の負荷 - 10 * .1 = 1 キャンセルの負荷 = 15 * .01= 0.15 ここで、予約の調整はスループットに最大の影響を与えます。スレッド ダンプ (Java ベースのアプリケーションの場合) を繰り返し取得することで、スループットのホット スポットを特定することもできます。
プロファイラーを使用します。
1つの特定のメソッドのみの時間を計測する必要がある場合は、Stopwatchクラスが適切な選択となる可能性があります。
一部のパフォーマンス分析のニーズに対応できるネイティブの.NETオプション(ソフトウェア開発者向けのTeam Edition)があります。2005 .NET IDEメニューから、[ツール]->[パフォーマンスツール]->[パフォーマンスウィザード...]を選択します。
[GSSは、TeamEditionが必要であることはおそらく正しいです]
私は次のことを行います:1)現在の時刻を測定するためにティック(VB.Net Now.ticksなど)を使用します。終了したティック値から開始ティックを減算し、TimeSpan.TicksPerSecondで割って、何秒かかったかを取得します。2)UI操作(console.writelineなど)を避けます。3)コードを実質的なループ(100,000回の反復など)で実行して、使用量/OS変数を可能な限り除外します。
StopWatchクラスを使用してメソッドの時間を計測できます。コードを書き留める必要があるため、初回は遅いことが多いことを覚えておいてください。
これは、コード速度をテストするための簡単な例です。私はあなたを助けたことを願っています
class Program {
static void Main(string[] args) {
const int steps = 10000;
Stopwatch sw = new Stopwatch();
ArrayList list1 = new ArrayList();
sw.Start();
for(int i = 0; i < steps; i++) {
list1.Add(i);
}
sw.Stop();
Console.WriteLine("ArrayList:\tMilliseconds = {0},\tTicks = {1}", sw.ElapsedMilliseconds, sw.ElapsedTicks);
MyList list2 = new MyList();
sw.Start();
for(int i = 0; i < steps; i++) {
list2.Add(i);
}
sw.Stop();
Console.WriteLine("MyList: \tMilliseconds = {0},\tTicks = {1}", sw.ElapsedMilliseconds, sw.ElapsedTicks);