在我的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
}
请纠正我是否正在使用正确的代码,或者我是否需要修改以获得更好的性能和结果。
答案 0 :(得分:16)
您应该使用Stopwatch
。 Stopwatch
对于时间测量而言比壁挂时钟更准确。
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将整数保存为分钟或秒数。