什么是计算时间跨度的最佳方法

在我的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 } 

请纠正我是否正在使用正确的代码,或者我是否需要修改以获得更好的性能和结果。

你应该使用StopwatchStopwatch比墙上时钟更精确的时间测量。

 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; 

此示例使用三元运算符将整数保存为分钟或秒数。