什么是计算时间跨度的最佳方法
在我的c#程序中,我的要求是计算业务逻辑执行的时间跨度,该时间跨越foreach循环,我必须存储时间跨度。
我正在使用以下代码
for (int i = 0; i < 100; i++) { DateTime start= DateTime.Now; // Business logic DateTime end= DateTime.Now; TimeSpan time = start.Subtract(end); // Save timespan in log file }
请纠正我是否正在使用正确的代码,或者我是否需要修改以获得更好的性能和结果。
你应该使用Stopwatch
。 Stopwatch
比墙上时钟更精确的时间测量。
var sw = Stopwatch.StartNew(); // business logic sw.Stop(); TimeSpan time = sw.Elapsed;
最简单的方法是:
TimeSpan time = DateTime.Now - start;
或者,您可以使用秒表来提供更准确的结果。 有关如何使用秒表的信息,请参见http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx 。
看起来您正在使用时间跨度来衡量性能。 您的代码很好,但是您应该知道DateTimes只是如此精确(大多数机器上大约10-15ms – 请参阅此处的“无用计时器机制”部分以获得解释)。
DateTimes也不连续; 如果在夏令时开始之前检索到第一个DateTime会怎样,后一个就在之后? 需要一秒钟的操作可能会显示为花费一个小时,甚至是负时间。 即使在UTC中的所有时间,当用户手动更改时间或由计算机进入睡眠和唤醒等引起的跳跃时,也存在潜在的问题。
一个更好的选择是使用Stopwatch
类 ,它专为此类事物而设计,并在内部使用高精度计时器(通过QueryPerformanceCounter()
Win32函数)。
要回答您的后续问题,(1)您是对的,您不需要每次迭代重新实例化StopWatch。 你只需要使用restart方法,如下所示:
Stopwatch sw = new Stopwatch(); sw.Start(); // To initialize for (int i = 0; i < 100; i++) { sw.Restart(); // Business logic TimeSpan time = sw.Elapsed; // Save timespan in log file }
(2)你可能需要编写几行代码,如果小于一分钟,则以秒为单位返回值;如果大于,则返回分钟数,但这里是一个例子(假设这是保存后的行)上例中的时间跨度):
TimeSpan time = sw.Elapsed; int iSecondsOrMinutes = time.TotalSeconds < 60 ? time.Seconds : (int)time.TotalMinutes;
此示例使用三元运算符将整数保存为分钟或秒数。