【问题标题】:What would be faster: addition w/ loop or w/o loop? [closed]什么会更快:添加带循环或不带循环? [关闭]
【发布时间】:2017-08-22 16:45:23
【问题描述】:

什么会更快:添加带循环或不带循环 (C#)? 我是说

int a=0;
for (int i=1;i<4;i++)
    a+=2*i;

int a=0;
a+=2*1;
a+=2*2;
a+=2*3;

【问题讨论】:

  • 没什么区别,重要的是可读性和可维护性。所以使用循环
  • 在现代 CPU 上您不会看到任何区别,因为您的循环分支是免费的。即使它们不是,您也必须如此频繁地循环才能看到差异,串行执行不是一种选择。
  • 如果您想要速度,请使用公式,而不是蛮力。
  • 两者都是可悲的 cf。明显的封闭形式解决方案。尽管第二种方式更明确地在编译时可评估——也许一个好的 C 或 C++ 编译器将有更好的机会优化后者。我对 C# 编译器的功能一无所知。
  • 必填performance rant。自己赛马

标签: c# loops optimization


【解决方案1】:

对于这个进程,

n |  0 |  1 |  2 |  3 |  4 |  5 
--------------------------------
a |  0 |  2 |  6 | 12 | 20 | 30

封闭式是,

a = n(1+n);

这总是比任何蛮力方法更有效。如果效率不重要,那么封闭形式仍然更容易阅读。

如果您没有时间计算出封闭形式,那么对于除最短迭代之外的所有迭代,循环的输入都会减少。这就是我们在语言中使用它们的原因,对吧?

【讨论】:

  • 改进算法总是比微优化更好(尤其是在没有分析的情况下)
【解决方案2】:

如果考虑到使用的时钟周期数,那么没有循环的实现会更快,因为

int a=0;                   - 1
for (int i=1;i<4;i++)      - 11
    a+=2*i;                (1+11 = 12 clock cycles)

在哪里

int a=0;                   - 1
a+=2*1;                    - 1
a+=2*2;                    - 1
a+=2*3;                    - 1 (1+1+1+1 = 4 clock cycles)

但这并不重要,因为时钟频率以千兆赫为单位,这几乎可以忽略不计,而且编译器会在编译期间重新组装您的代码,这是优化版本。

【讨论】:

  • 这完全忽略了编译器优化,并对每一步所需的时钟周期做了很多假设(例如:为什么a+=2*2;只有一个周期?)
  • 我认为您可能需要一些其他时钟周期来处理诸如写入寄存器和边界检查等内容。也许更合乎逻辑的术语会更好。
猜你喜欢
  • 2016-03-13
  • 1970-01-01
  • 2020-12-25
  • 1970-01-01
  • 2014-10-28
  • 1970-01-01
  • 2021-12-14
  • 1970-01-01
  • 2012-03-10
相关资源
最近更新 更多