2
我发现了几篇文章(包括SA中的一些问题),试图找到基本操作的代价。C#执行基本操作
但是,我试图制作自己的小程序,以便自己测试。当试图测试加减我遇到了一些东西,我为您介绍在简单的代码
int a,i,j;
DateTime d1,d2;
a = 0;
d1= DateTime.Now;
for (i = 1; i <= 10000; i++)
for (j = 1; j <= 10000; j++)
a = a + 1;
d2=DateTime.Now;
Console.WriteLine("a=a+1\t1E8\t"+(d2-d1));
a = 0;
d1 = DateTime.Now;
for (i = 1; i <= 10000; i++)
for (j = 1; j <= 10000; j++)
a = a + 1;
d2 = DateTime.Now;
Console.WriteLine("a=a+1\t1E8\t" + (d2 - d1));
a = 0;
d1 = DateTime.Now;
for (i = 1; i <= 10000; i++)
for (j = 1; j <= 10000; j++)
a = a + 1;
d2 = DateTime.Now;
Console.WriteLine("a=a+1\t1E8\t" + (d2 - d1));
a = 0;
d1 = DateTime.Now;
for (i = 1; i <= 10000; i++)
for (j = 1; j <= 10000; j++)
a = a + 1;
d2 = DateTime.Now;
Console.WriteLine("a=a+1\t1E8\t" + (d2 - d1));
Console.ReadKey();
首先我声明了一些变量,然后我执行同一任务的4倍。我每次都做完全相同的事情。 始终,结果如下:
a=a+1 1E8 00:00:00.2300230
a=a+1 1E8 00:00:00.2180218
a=a+1 1E8 00:00:00.2130213
a=a+1 1E8 00:00:00.2150215
或
a=a+1 1E8 00:00:00.2340000
a=a+1 1E8 00:00:00.2170000
a=a+1 1E8 00:00:00.2130000
a=a+1 1E8 00:00:00.2100000
这意味着第一时间,它总是需要更长的时间来计算(长大约5%)。所有其他时间,时间大致相同。
然后,我只是在第一个a=0;
之后添加行a=0;
。结果如下:
a=a+1 1E8 00:00:00.2210000
a=a+1 1E8 00:00:00.2170000
a=a+1 1E8 00:00:00.2200000
a=a+1 1E8 00:00:00.2170000
甚至
a=a+1 1E8 00:00:00.2160000
a=a+1 1E8 00:00:00.2160000
a=a+1 1E8 00:00:00.2200000
a=a+1 1E8 00:00:00.2230000
所以3个问题:
- 为什么第一个循环时间比第一个例子休息一会儿吗?
- 为什么所有的循环在第二个例子中花费大约相同的时间?
- 有没有什么更好的方法来计算比
Datetime
个人POV时间间隔: 东西需要在程序开始运行时被初始化。通过增加一个额外的命令(a = 0),我给了程序进行初始化的时间。
POV中的缺陷: 当我将循环次数从10^8更改为10^9时,time1和time2之间的差异应该再次为〜0.015s(如果我的POV有效)。但现在它又是〜0.15s(意思是〜5%)。如果我添加第二个a=0
,然后重新时间1〜时间2〜时间3〜时间4
你真的应该阅读Eric Lippert关于基准测试错误的博客文章:http://ericlippert.com/tag/benchmarks/ –
JIT编译器。Jon的链接(Eric的文章)是一篇很棒的文章。如果没有别的办法,你应该从中拿走什么是“在衡量平均表现时,把第一次看作没什么特别之处”。 –
“操作成本”很可能取决于操作前后的操作。 –