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

时间:2011-12-29 06:49:22

标签: c# datetime timespan

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

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

4 个答案:

答案 0 :(得分:16)

您应该使用StopwatchStopwatch对于时间测量而言比壁挂时钟更准确。

var sw = Stopwatch.StartNew();
// business logic
sw.Stop();
TimeSpan time = sw.Elapsed;

答案 1 :(得分:2)

最简单的方法是:

TimeSpan time = DateTime.Now - start;

或者,您可以使用秒表来提供更准确的结果。有关如何使用秒表的信息,请参阅http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx

答案 2 :(得分:1)

看起来您正在使用时间跨度来衡量效果。您的代码很好,但是您应该知道DateTimes只是如此精确(在大多数机器上大约10-15ms - 请参阅“无用的计时器机制”部分here以获得解释)。

DateTimes也不连续;如果第一个DateTime在夏令时开始之前被检索出来,而后一个就在之后呢?需要一秒钟的操作可能会显示为花费一个小时,甚至是负时间。即使是UTC中的所有时间,当用户手动更改时间或计算机进入睡眠和唤醒等引起的跳跃时,也存在潜在的问题。

更好的选择是使用专为此类设计的Stopwatch class,并在内部使用高精度计时器(通过QueryPerformanceCounter() Win32函数)。

答案 3 :(得分:1)

要回答您的后续问题,(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;

此示例使用Ternary Operator将整数保存为分钟或秒数。