我需要计算用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以获取经过时间的实际值?
答案 0 :(得分:63)
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;
答案 1 :(得分:9)
这个答案只试图计算两次之间经过的总毫秒数,其中时间直接来自DateTime.Now
。根据谈话,我们了解DateTime.Now
容易受到外界的影响。因此,最好的解决方案是使用Stopwatch
类。这是一个更好地解释(IMO)并讨论performance between DateTimeNow, DateTime.Ticks, StopWatch。
原始答案
将它转换为int的方式就是问题。你需要更好的铸造和额外的元素:) 与有效的计时器相比,这可能看起来很简单。但它的确有效:
DateTime startTime, endTime;
startTime = DateTime.Now;
//do your work
endTime = DateTime.Now;
Double elapsedMillisecs = ((TimeSpan)(endTime - startTime)).TotalMilliseconds;
网络上有reference,您也可以查看。
答案 2 :(得分:3)
您正在寻找Stopwatch课程。它专门用于恢复高精度时间测量。
var stopwatch = new Stopwatch();
stopwatch.Start();
for (int i = 0; i < N_ITER; i++)
{
// cpu intensive sequence
}
stopwatch.Stop();
var elapsed = stopwatch.ElapsedMilliseconds;
答案 3 :(得分:2)
DateTime.Millisecond只返回秒的毫秒分数,从0-999。在进行计时时,您需要考虑剩余的日期时间。
但是,您应该考虑使用StopWatch类来实现这些性能时序。
答案 4 :(得分:1)
以下是我用来获取简单计算时间的内容:
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));
}
}
答案 5 :(得分:0)
这对我有用:
var lapsedTime = DateTime.Now.Subtract(beginTime).TotalMilliseconds;
答案 6 :(得分:0)
秒表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);