どのメソッド実装がより速く実行されるのかテスト方法
-
26-09-2020 - |
質問
reed copsey Char.IsLetter
:
string myString = "RandomStringOfLetters";
bool allLetters = myString.All( c => Char.IsLetter(c) );
.
適応 Regex からの解href="https://stackoverflowflow.com/users/61974/mark-byers">マークバイヤー:
string s = "RandomStringOfLetters";
bool allLetters = Regex.IsMatch(s, "^[a-z]+$", RegexOptions.IgnoreCase);
.
どちらかの葦やマークの質問をしたくないと思っていないと思ったと思ったと思ったと思ったと思ったと思ったと思った。問題は私は多くのコード最適化を行っていません(私は他のすべての上にコードの読みやすさを置く傾向がある傾向があります)。
それぞれの実行前後のタイムスタンプを取ること以外は、どちらを早く実行するかを判断するオプションは何ですか?
編集
私は修正 Martinの答え働くConsole.WriteLine(...)
を使用してコンソールアプリケーションとして実行しました。 linqpad を実行する方法はよくわかりませんが、結果は同じです。
41 178.
解決
あなたは STOPWATCH 。また、プロファイリング時に留めておくべきいくつかの非常に重要なことがいくつかあります。
- 常にテストを1回以上実行してください。初めて実行したときは、JITからオーバーヘッドがあり、タイミングは誤解を招く可能性があります。何度も走り、平均を取っているのは良いアプローチです(たとえば、この10万倍のようにテストを実行します。)
- Visual Studioホスティングプロセスの外で、常にフルリリースビルドでテストを実行します。(デフォルトでは、これにはCtrl + F5を使用できます。)Visual Studioホストはタイミングに劇的に影響します。
他のヒント
System.Diagnostics.Stopwatch
をチェックしてください!
href="http://msdn.microsoft.com/en-us/library/system.diagnostics.StopWatch.aspx" REL="NOFOLLOW NOREFERRER"> http://msdn.microsoft.com/jp-US / Library / System.Diagnostics.StopWatch.aspx
タイミングエラーや他の制御不能な要因を減らすためにループ内で多くのものを実行する必要があります。
助けを願っています。
私はちょうど 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
. 使用できるSystem.Diagnostics.StopWatchクラスがあります。
どのコードをテストしてもテストを1回実行してJITコストを削除してから、最後のタイミングに対して再度実行します。ほとんどの個々のタイミングカウントは、PC上の他の要因により、その結果、多くの反復を実行してからその平均ランタイムを計算します。
System.Diagnostics.StopWatchクラスを使用します。
ストップウォッチを起動して数千の反復を実行し、停止して経過した総ミリ秒を確認します。
どちらが速いかを判断する手順: -
-
コンピュータのコレクションを取得し、数百台、AMD / Intel /その他、32ビット/ 64ビット、...
-
それぞれを気にするすべての.NETフレームワークをインストールする(順番に)
-
コンパイルの最適化オプションの各組み合わせ(順番に)
-
各
の大きな実行をテストするには、ストップウォッチを使用します。
-
それぞれのためのメモリ使用率をモニタすることは、あなたのアプリケーションの残りの部分に大きな影響を与える可能性があります。メモリ消費量の増加費用で数サイクルを節約すると、ガーベージコレクションアクティビティが貧弱な「最適化」がよくあります。
そのかもしれませんは、少なくともコンパイラの現在のリリースでは、実際には速く早くなっているという考えを与えます。コンパイラの新しいリリースごとに繰り返します。