C#基本操作的性能

C#基本操作的性能,c#,performance-testing,C#,Performance Testing,我找到了几篇文章(包括SA中的一些问题),试图找到基本操作的成本 然而,我试着制作我自己的小程序,这样我就可以自己测试它了。在尝试测试加法和减法时,我遇到了一些问题,我用简单的代码向您展示了这些问题 int a,i,j; DateTime d1,d2; a = 0; d1= DateTime.Now; for (i = 1; i <= 10000; i++) for (j = 1; j

我找到了几篇文章(包括SA中的一些问题),试图找到基本操作的成本

然而,我试着制作我自己的小程序,这样我就可以自己测试它了。在尝试测试加法和减法时,我遇到了一些问题,我用简单的代码向您展示了这些问题

       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();

这意味着,第一次计算总是需要更长的时间(大约长5%)。其他时间,时间都差不多

然后我只添加一行
a=0a=0后的code>。结果如下:

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时,时间1和时间2之间的差值应再次为~0.015秒(如果我的POV有效)。但现在又是~0.15s(也就是~5%)。如果我添加第二个
    a=0
    ,然后再次添加时间1~时间2~时间3~时间4

    回答您的问题3-

    有没有比Datetime更好的计算时间间隔的方法?


    使用System.Diagnostics.Stopwatch测量时差,因为它提供了非常高的精度。

    您应该真正阅读Eric Lippert关于基准错误的博客文章:JIT编译器。。乔恩的链接(埃里克的帖子)是一本很棒的读物。如果没有其他东西,你应该从中吸取的是“在衡量平均性能时,将第一次运行视为没有什么特别之处”。“操作成本”很可能取决于它之前和之后的操作。@SimonWhitehead为什么JIT是一个问题?在他的测量过程中不应该有JIT编译,它可以是任何东西。试图从与DateTime基准测试结果相差很小一部分秒的结果中做出任何假设,这本身就是荒谬的。
    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