度量代码执行时间

为了测试的目的,我想知道一个过程/函数/订单需要多少时间才能完成。

这就是我所做的,但是我的方法是错误的,因为如果秒差为0,就不能返回经过的毫秒:

注意,休眠值是500ms,所以经过的秒数是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)
182348 次浏览

更好的方法是使用 秒表,而不是 DateTime差异。

秒表类-微软文档

提供一组方法和属性,可用于 精确测量运行时间。

// create and start a Stopwatch instance
Stopwatch stopwatch = Stopwatch.StartNew();


// replace with your sample code:
System.Threading.Thread.Sleep(500);


stopwatch.Stop();
Console.WriteLine(stopwatch.ElapsedMilliseconds);

如果使用 Stopwatch 类,则可以使用 。开始新()方法将表重置为0。所以你不必调用 。重置()后面跟着 。开始()。可能会派上用场。

你可以使用这个秒表包装:

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基准NBench

秒表就是为此而设计的,它是测量.NET 中执行时间的最佳方法之一。

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

不要使用 DateTimes 来度量.NET 中的执行时间。

如果您正在查找关联线程在应用程序内运行代码所花费的时间量。
可以使用 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

注意: 如果您使用多个线程,您可以单独计算每个线程的时间,并将其相加以计算总持续时间。

如何使用 VB.NET中的 Stopwatch 类的示例。

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)