C#で記述されたコードシーケンスの実行時間を計る必要があります。 DateTime.Nowを使用すると、ミリ秒フィールドの値が正しくありません。例えば:
int start_time, elapsed_time;
start_time = DateTime.Now.Millisecond;
for(int i = 0; i < N_ITER; i++) {
// cpu intensive sequence
}
elapsed_time = DateTime.Now.Millisecond - start_time;
elapsed_timeは負の値を与えます。
経過時間の実際の値を取得するために、DateTimeをどのように置き換えることができますか?
using System.Diagnostics;
//...
var stopwatch = new Stopwatch();
stopwatch.Start();
for (int i = 0; i < N_ITER; i++) {
// cpu intensive sequence
}
stopwatch.Stop();
elapsed_time = stopwatch.ElapsedMilliseconds;
この答えは、2つの時間の間に経過したミリ秒の合計をカウントしようとしているだけです。時間はDateTime.Now
。会話ごとに、DateTime.Now
は外部の影響に対して脆弱です。したがって、最良の解決策はStopwatch
クラスを使用することです。以下に、IMOをよりよく説明し、 DateTimeNow、DateTime.Ticks、StopWatch間のパフォーマンス を説明するリンクを示します。
元の回答
Intにキャストする方法が問題です。より良いキャストと追加の要素が必要です:)これは、効率的なタイマーと比較して単純に見えるかもしれません。しかし、それは動作します:
DateTime startTime, endTime;
startTime = DateTime.Now;
//do your work
endTime = DateTime.Now;
Double elapsedMillisecs = ((TimeSpan)(endTime - startTime)).TotalMilliseconds;
Webには reference があります。同様にチェックアウトすることもできます。
ストップウォッチ クラスを探しています。高精度の時間測定を取り戻すために特別に設計されています。
var stopwatch = new Stopwatch();
stopwatch.Start();
for (int i = 0; i < N_ITER; i++)
{
// cpu intensive sequence
}
stopwatch.Stop();
var elapsed = stopwatch.ElapsedMilliseconds;
DateTime.Millisecond は、秒のミリ秒の小数部を0〜999で返します。計時を行う際には、残りの日時を考慮する必要があります。
ただし、これらの種類のパフォーマンスタイミングには StopWatch クラスの使用を検討する必要があります。
以下は、単純な計算の時間を取得するために使用したものです。
class Program
{
static void Main(string[] args)
{
Decimal p = 0.00001m;
Decimal i = 0m;
DateTime start = new DateTime();
DateTime stop = new DateTime();
for (i = p; i <= 5; i = i + p)
{
Console.WriteLine("result is: " + i);
if (i==p) start = DateTime.Now;
if (i==5) stop = DateTime.Now;
}
Console.WriteLine("Time to compute: " + (stop-start));
}
}