コード実行時間の測定


120

テストの目的で、プロシージャ/関数/オーダーが完了するまでにかかる時間を知りたい。

これは私がやったことですが、秒の差が0の場合、経過したミリ秒を返すことができないため、私の方法は間違っています:

スリープ値は500ミリ秒なので、経過秒数は0であり、ミリ秒を返すことができないことに注意してください。

    Dim Execution_Start As System.DateTime = System.DateTime.Now
    Threading.Thread.Sleep(500)

    Dim Execution_End As System.DateTime = System.DateTime.Now
    MsgBox(String.Format("H:{0} M:{1} S:{2} MS:{3}", _
    DateDiff(DateInterval.Hour, Execution_Start, Execution_End), _
    DateDiff(DateInterval.Minute, Execution_Start, Execution_End), _
    DateDiff(DateInterval.Second, Execution_Start, Execution_End), _
    DateDiff(DateInterval.Second, Execution_Start, Execution_End) * 60))

誰かがこれを行うためのより良い方法を教えてくれますか?多分TimeSpan

ソリューション:

Dim Execution_Start As New Stopwatch
Execution_Start.Start()

Threading.Thread.Sleep(500)

MessageBox.Show("H:" & Execution_Start.Elapsed.Hours & vbNewLine & _
       "M:" & Execution_Start.Elapsed.Minutes & vbNewLine & _
       "S:" & Execution_Start.Elapsed.Seconds & vbNewLine & _
       "MS:" & Execution_Start.Elapsed.Milliseconds & vbNewLine, _
       "Code execution time", MessageBoxButtons.OK, MessageBoxIcon.Information)

1
あなたはこの質問の私の答えを見ることができます:> stackoverflow.com/a/16130243/1507182幸運
オバマ

1
@Soner C#でタグ付けした場合は、C#コードを歓迎します。
ElektroStudios 2013年


2
ストップウォッチを使用する明らかな理由以外に、DateTime.Now夏時間とタイムゾーンの問題のために、決して計算を行うべきではありません。この件についての私のブログ投稿を
Matt Johnson-Pint 2013年

回答:


234

より良い方法は、違いの代わりにストップウォッチを使用することDateTimeです。

ストップウォッチクラス-Microsoft Docs

経過時間を正確に測定するために使用できる一連のメソッドとプロパティを提供します。

Stopwatch stopwatch = Stopwatch.StartNew(); //creates and start the instance of Stopwatch
//your sample code
System.Threading.Thread.Sleep(500);
stopwatch.Stop();
Console.WriteLine(stopwatch.ElapsedMilliseconds);

1
@ElektroHacker、どういたしまして、使いやすく、DateTimeよりも正確です:)
Habib

1
github.com/chai-deshpande/LogExecを参照してください(NUGETパッケージはnuget.org/packages/LogExecでも入手できます)。これは@ soner-gonulが述べたのとまったく同じことを行いますが、使用法は煩雑でなく、すべてのボイラープレートコードを隠しています。頻繁に使用したい場合に非常に役立ちます。また、Common.Loggingを使用して、優先するロギングプロバイダーと統合できます。
Chai

1
@Habib Thread.sleep(500)が必要な理由を理解するのを手伝ってくれませんか?睡眠をスキップすることはできませんが、効率が悪くなりますか?
Md Sifatul Islam 2017

8
@ Md.SifatulIslam、を使用する必要はありません。Thread.Sleep遅延を示すサンプルコードとして存在します...実際Thread.Sleep、コード内のどこにも使用しないでください
Habib

59

Stopwatch 経過時間を測定します。

// Create new stopwatch
Stopwatch stopwatch = new Stopwatch();

// Begin timing
stopwatch.Start();

Threading.Thread.Sleep(500)

// Stop timing
stopwatch.Stop();

Console.WriteLine("Time elapsed: {0}", stopwatch.Elapsed);

ここにありますDEMO


コードの各行の実行時間に使用できますか?例:bindingSource.datasource = db.table; //どのくらい時間がかかりますか?
vaheeds 2013

2
@vaheedsもちろん。これStopwatchを各行の上から開始し、各行の後に停止してください。覚えておいてください、あなたはStopwatch.Reset計算するためにすべての行の後にも使う必要がある あなたのラインに基づいて; ルック取るideone.com/DjR6ba
SonerGönül

私はミリ秒を画像から外すために少しトリックをしました。this way watch.Elapsed.ToString()。Split( '。')[0]
Doruk

2
うん@Doruk、あなたはそれを行うことができます。また、使用できるカスタムタイムスパン書式指定文字列のようにstopwatch.Elapsed.ToString(@"d\.hh\:mm\:ss")私にはクリーンな方法を思われるが。
SonerGönül2016

1
ベストアンサー。ありがとう!
Tadej

48

このストップウォッチラッパーを使用できます。

public class Benchmark : IDisposable 
{
    private readonly Stopwatch timer = new Stopwatch();
    private readonly string benchmarkName;

    public Benchmark(string benchmarkName)
    {
        this.benchmarkName = benchmarkName;
        timer.Start();
    }

    public void Dispose() 
    {
        timer.Stop();
        Console.WriteLine($"{benchmarkName} {timer.Elapsed}");
    }
}

使用法:

using (var bench = new Benchmark($"Insert {n} records:"))
{
    ... your code here
}

出力:

Insert 10 records: 00:00:00.0617594

高度なシナリオでは、BenchmarkDotNetまたはBenchmark.ItまたはNBenchを使用できます。


3
ありがとう、これまでのベストアンサー
pixel

2
おかげで、一元的な方法でそのようなものを探していました。ActionFilterでもこの戦略を実行しています。
'2016年

13

Stopwatchクラスを使用する場合は、.StartNew()メソッドを使用してウォッチを0にリセットできます。したがって.Reset ()の後に.Start()を呼び出す必要はありません重宝するかもしれません。


4

ストップウォッチはこの目的のために設計されており、.NETでの時間実行を測定するための最良の方法の1つです。

var watch = System.Diagnostics.Stopwatch.StartNew();
/* the code that you want to measure comes here */
watch.Stop();
var elapsedMs = watch.ElapsedMilliseconds;

.NETでの時間実行の測定にDateTimesを使用しないでください。


3

関連するスレッドがアプリケーション内でコードの実行に費やした時間を探している場合。名前空間の下で取得できるプロパティを
使用ProcessThread.UserProcessorTimeできSystem.Diagnosticsます。

TimeSpan startTime= Process.GetCurrentProcess().Threads[i].UserProcessorTime; // i being your thread number, make it 0 for main
//Write your function here
TimeSpan duration = Process.GetCurrentProcess().Threads[i].UserProcessorTime.Subtract(startTime);

Console.WriteLine($"Time caluclated by CurrentProcess method: {duration.TotalSeconds}"); // This syntax works only with C# 6.0 and above

注:マルチスレッドを使用している場合は、各スレッドの時間を個別に計算し、合計して合計期間を計算できます。


0

ストップウォッチクラスの使用方法のvb.netバージョンを確認できなかったため、以下に例を示します。

        Dim Stopwatch As New Stopwatch

        Stopwatch.Start()
                    ''// Test Code
        Stopwatch.Stop()
        Console.WriteLine(Stopwatch.Elapsed.ToString)

        Stopwatch.Restart()            
                   ''// Test Again

        Stopwatch.Stop()
        Console.WriteLine(Stopwatch.Elapsed.ToString)

これがvb.netを探してこの質問に到達したすべての人に役立つことを願っています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.