2013-10-10 84 views
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个问题:

  1. 为什么第一个循环时间比第一个例子休息一会儿吗?
  2. 为什么所有的循环在第二个例子中花费大约相同的时间?
  3. 有没有什么更好的方法来计算比Datetime

个人POV时间间隔: 东西需要在程序开始运行时被初始化。通过增加一个额外的命令(a = 0),我给了程序进行初始化的时间。

POV中的缺陷: 当我将循环次数从10^8更改为10^9时,time1和time2之间的差异应该再次为〜0.015s(如果我的POV有效)。但现在它又是〜0.15s(意思是〜5%)。如果我添加第二个a=0,然后重新时间1〜时间2〜时间3〜时间4

+7

你真的应该阅读Eric Lippert关于基准测试错误的博客文章:http://ericlippert.com/tag/benchmarks/ –

+1

JIT编译器。Jon的链接(Eric的文章)是一篇很棒的文章。如果没有别的办法,你应该从中拿走什么是“在衡量平均表现时,把第一次看作没什么特别之处”。 –

+0

“操作成本”很可能取决于操作前后的操作。 –

回答

3

回答你的问题数3 -

有没有什么更好的方法来计算比日期时间的时间间隔?

使用System.Diagnostics.Stopwatch测量时间差,因为它提供了非常高的准确性。