3

入力が文字列のタイプであるかどうかの質問チェックが閉じられている間、2つの答えが私の心の中でマイクロ最適化の質問を引き起こしました:以下の2つの解決策のどちらがより良いパフォーマンスを発揮しますか?

Reed Copseyは、以下を使用してソリューションをChar.IsLetter提供しました。

string myString = "RandomStringOfLetters";
bool allLetters = myString.All( c => Char.IsLetter(c) );

Mark Byersの正規表現を使用した適応ソリューション

string s = "RandomStringOfLetters";
bool allLetters = Regex.IsMatch(s, "^[a-z]+$", RegexOptions.IgnoreCase);

リードとマークのどちらかに質問したくないので、どちらが優れているかを判断するための簡単なテストを作成すると思いました。問題は、コードの最適化をあまり行っていないことです(コードの可読性を何よりも優先する傾向があります)。

それぞれの実行の前後にタイムスタンプを取得する以外に、どのソリューションがより高速に実行されるかを決定する他の(より良い?)オプションは何ですか?

編集

Martinの回答を修正Console.WriteLine(...)して、コンソールアプリケーションとして実行しました。LinqPadがアプリケーションを実行する方法は正確にはわかりませんが、結果はほぼ同じでした。

41
178
4

6 に答える 6

7

ストップウォッチを使用してランタイムを測定し、これを実行する必要があります。また、プロファイリングの際に留意すべき非常に重要な事項をいくつか示します。

  1. テストは常に1回以上実行してください。初めて実行するときは、JITからのオーバーヘッドが発生し、タイミングが誤解を招く可能性があります。何度も実行して平均を取るのは良いアプローチです(たとえば、このようなテストを10万回実行することがよくあります)。
  2. Visual Studioホスティングプロセスの外部で、常に完全なリリースビルドを使用してテストを実行します。(デフォルトでは、これにCtrl + F5を使用できます。)VisualStudioホストはタイミングに劇的な影響を与えます。
于 2010-07-21T16:04:07.787 に答える
2

あなたはチェックアウトする必要がありますSystem.Diagnostics.Stopwatch

http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx

タイミングエラーやその他の制御できない要因を減らすために、ループ内で何度も実行する必要があります。

お役に立てば幸いです。

于 2010-07-21T16:01:35.500 に答える
2

これをLINQPadにまとめて、その方法の例を示します(したがって、この便利なツールを使用していない場合は、Dump()の呼び出し-Console.WriteLine(...)に置き換えてください)。

LINQの方法は4倍強速いようです。

System.Diagnostics.Stopwatch stopwatch = new Stopwatch();

stopwatch.Start();
for (int i = 0; i < 100000; i++)
{
 string myString = "RandomStringOfLetters";
 bool allLetters = myString.All( c => Char.IsLetter(c) );
}
stopwatch.Stop();
stopwatch.ElapsedMilliseconds.Dump();

stopwatch.Reset();

stopwatch.Start();
for (int i = 0; i < 100000; i++)
{
 string s = "RandomStringOfLetters";
 bool allLetters = Regex.IsMatch(s, "^[a-z]+$", RegexOptions.IgnoreCase);
}
stopwatch.Stop();
stopwatch.ElapsedMilliseconds.Dump();

出力:

47 
196
于 2010-07-21T16:06:59.653 に答える
0

使用できるSystem.Diagnostics.Stopwatchクラスがあります。

テストするコードが何であれ、テストを1回実行してJITコストを削除してから、最終的なタイミングで再度実行します。ほとんどの個々のタイミングカウントは、PC上の他の要因のために代表的ではない可能性があります。したがって、多くの反復を実行し、そこから平均実行時間を計算します。

于 2010-07-21T16:02:49.207 に答える
0

System.Diagnostics.Stopwatchクラスを使用します。

StopWatchを開始して数千回の反復を実行し、停止して、経過した合計ミリ秒を確認します

于 2010-07-21T16:03:04.260 に答える
0

どちらが速いかを判断する手順:-

  1. コンピュータのコレクションを入手してください。AMD/Intel/ other、32ビット/ 64ビット、...

  2. 気になるすべての.NETFrameworkをそれぞれにインストールします(順番に)

  3. コンパイルのための最適化オプションの各組み合わせを試してください(順番に)

  4. StopWatchを使用して、それぞれの大規模な実行をテストします

  5. アプリケーションの他の部分に大きな影響を与える可能性があるため、それぞれのメモリ使用率を監視します。メモリ消費量の増加とガベージコレクションアクティビティの増加を犠牲にして数サイクルを節約することは、多くの場合、不十分な「最適化」です。

これにより、少なくともコンパイラの現在のリリースでは、どちらが実際に高速であるかについてのアイデアが得られる可能性があります。コンパイラの新しいリリースごとに繰り返します。

于 2010-07-21T16:08:58.877 に答える