【问题标题】:C# performance of basic operations基本操作的 C# 性能
【发布时间】:2013-10-17 20:27:18
【问题描述】:

我找了几篇文章(包括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();

首先我声明了一些变量,然后我执行了 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更好的计算时间间隔的方法?

个人观点: 程序开始运行时需要初始化一些东西。通过添加一个额外的命令(a=0),我给程序时间进行初始化。

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

【问题讨论】:

  • 您真的应该阅读 Eric Lippert 关于基准错误的博文:ericlippert.com/tag/benchmarks
  • JIT 编译器.. Jon 的链接(Eric 的帖子)读起来很棒。如果没有别的,你应该从中得到的是“在衡量平均性能时,将第一次运行视为没什么特别的”。
  • “手术成本”很可能取决于它之前和之后的操作。
  • @SimonWhitehead 为什么这里的 JIT 是个问题?在他的测量过程中不应该有JIT编译。
  • 它可以是任何东西。试图从以 DateTime.Now 为基准的一小部分秒的不同结果中做出任何假设本身就是荒谬的。

标签: c# performance-testing


【解决方案1】:

回答您的问题 3 -

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多