我试图“基准”两个几乎相同的循环。当我逐个检查它们时,减法没有任何打嗝,TimeSpan将正确的数字作为TotalMilliseconds返回。当我将两个循环基准测试时,然后第一个减法返回一个介于3-4之间的数字(应该是正确的),而第二个减去总是返回0.我做错了什么?谢谢!
class Program
{
static void Main(string[] args)
{
Console.WriteLine(":: Simple for ::");
var a = 0;
var start = DateTime.Now;
for (int i = 0; i < 10; i++)
{
a += i;
}
Console.WriteLine("Elapsed time: {0} ms", (DateTime.Now - start).TotalMilliseconds); // 3 - 4 ms
Console.WriteLine(":: Fancy for ::");
a = 0;
start = DateTime.Now;
foreach (var i in Enumerable.Range(0, 9))
{
a += i;
}
Console.WriteLine("Elapsed time: {0} ms", (DateTime.Now - start).TotalMilliseconds); // 0 ms
}
}
答案 0 :(得分:3)
来自文档:
此属性的分辨率取决于系统计时器,在Windows系统上约为15毫秒。因此,在短时间间隔(例如循环)中重复调用Now属性可能会返回相同的值
Now属性经常用于衡量性能。但是,由于其分辨率低,因此不适合用作基准测试工具。更好的选择是使用秒表类。
答案 1 :(得分:2)
尝试使用专门用于基准测试的Stopwatch类:
Stopwatch timer = new Stopwatch();
timer.Start();
for (int i = 0; i < 10; i++)
{
a += i;
}
timer.Stop();
Console.WriteLine($"Elapsed time: {timer.Elapsed}");
结果(.Net 4.6 IA-64,Core i7 3.2 GHz)
00:00:00.0000003
请注意,时间约为300 纳米秒