36

我需要计时执行用 C# 编写的代码序列。使用 DateTime.Now 我得到的毫秒字段值不正确。例如:

 int start_time, elapsed_time;

 start_time = DateTime.Now.Millisecond;

 for(int i = 0; i < N_ITER; i++) {
       // cpu intensive sequence
 }

 elapsed_time = DateTime.Now.Millisecond - start_time;

elapsed_time 给出负值。

如何替换 DateTime 以获得经过时间的实际值?

4

7 回答 7

99
using System.Diagnostics;

//...

var stopwatch = new Stopwatch();
stopwatch.Start();
for (int i = 0; i < N_ITER; i++) {
    // cpu intensive sequence
}
stopwatch.Stop();
elapsed_time = stopwatch.ElapsedMilliseconds;
于 2012-11-27T17:38:10.957 回答
13

根据评论编辑答案

这个答案只是试图计算两次之间经过的总毫秒数,其中时间直接来自DateTime.Now. 根据谈话,据了解,这DateTime.Now很容易受到外部影响。因此,最好的解决方案是使用Stopwatch该类。这是一个链接,可以更好地解释(IMO)并讨论DateTimeNow、DateTime.Ticks、StopWatch 之间的性能

原始答案

您将其转换为 int 的方式是问题所在。您需要更好的转换和额外的元素 :) 与高效的计时器相比,这可能看起来很简单。但它有效:

DateTime startTime, endTime;
startTime = DateTime.Now;

//do your work

endTime = DateTime.Now;
Double elapsedMillisecs = ((TimeSpan)(endTime - startTime)).TotalMilliseconds;

网上有参考,你也可以看看。

于 2012-11-27T17:37:20.190 回答
6

您正在寻找秒表类。它专为带回高精度时间测量而设计。

var stopwatch = new Stopwatch();

stopwatch.Start();
for (int i = 0; i < N_ITER; i++)
{
     // cpu intensive sequence
}
stopwatch.Stop();

var elapsed = stopwatch.ElapsedMilliseconds;
于 2012-11-27T17:37:24.040 回答
2

DateTime.Millisecond仅返回从 0 到 999 秒的毫秒小数部分。在进行计时时,您需要考虑其余的日期时间。

但是,您应该考虑将StopWatch类用于这些类型的性能计时。

于 2012-11-27T17:37:44.360 回答
2

秒表 URL 中有示例
https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.stopwatch?view=netframework-4.8

using System.Diagnostics;
//...
Stopwatch watch = new Stopwatch();
watch.Start();
// here the complex program. 
//...
watch.Stop();
TimeSpan timeSpan = watch.Elapsed;
Console.WriteLine("Time: {0}h {1}m {2}s {3}ms", timeSpan.Hours, timeSpan.Minutes, 
timeSpan.Seconds, timeSpan.Milliseconds);
于 2019-12-27T16:06:17.660 回答
0

这是我用来获取简单计算时间的方法:

class Program
{
    static void Main(string[] args)
    {
        Decimal p = 0.00001m;
        Decimal i = 0m;
        DateTime start = new DateTime();
        DateTime stop = new DateTime();

        for (i = p; i <= 5; i = i + p)
        {
            Console.WriteLine("result is: " + i);
            if (i==p) start = DateTime.Now;
            if (i==5) stop = DateTime.Now;
        }

        Console.WriteLine("Time to compute: " + (stop-start));

    }
}
于 2013-02-07T10:56:34.277 回答
0

这对我有用:

var lapsedTime = DateTime.Now.Subtract(beginTime).TotalMilliseconds;
于 2019-04-10T05:21:00.923 回答