测量代码执行时间
为了testing的目的,我想知道一个程序/函数/命令需要多less时间才能完成。
这是我做的,但我的方法是错误的,因为如果秒的差异是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
?
解决scheme:
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)
更好的方法是使用秒表 ,而不是DateTime
差异。
秒表类 – MSDN
提供一组方法和属性,您可以使用这些方法和属性精确测量已用时间。
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);
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
。
你可以使用这个秒表包装:
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:")) { ... yout code here }
输出:
Insert 10 records: 00:00:00.0617594
对于高级场景,您可以使用Benchmark.It或NBench
如果您使用Stopwatch类,则可以使用.StartNew()方法将手表重置为0.因此,您不必调用.Reset(),然后再调用.Start ()。 可能会派上用场。
秒表是专门为此目的而devise的,是在.NET中测量时间执行的最佳方法之一。
var watch = System.Diagnostics.Stopwatch.StartNew(); /* the code that you want to measure comes here */ watch.Stop(); var elapsedMs = watch.ElapsedMilliseconds;
不要使用DateTimes来测量.NET中的时间执行。
- 表单不响应KeyDown事件
- 在.NET桌面应用Settings.settings与app.config
- 使用没有Web应用程序的Amazon Elastic Beanstalk部署.NET Windows服务
- 如何卸载“Microsoft .NET Core 1.0.0 RC2 – VS 2015 Tooling Preview 1”?
- 在构造System.Data.SQLite.SQLiteConnection时,什么原因导致System.BadImageFormatException
- 如何在GAC中列出所有注册的程序集?
- 获取图像尺寸而不读取整个文件
- 我需要一个事件来检测Internet连接/断开连接
- 等待池线程完成