【问题标题】:How many if statements can be executed in 1 sec approximately1秒内大约可以执行多少个if语句
【发布时间】:2016-03-16 17:53:54
【问题描述】:

我计划编写一个包含 10 个 for 循环并使用 for 循环超过 10000 次的项目。因此,大约有 10000 * 10^10 个 if 语句。在for循环结束时,有一个结果。我的项目是从 10 个 for 循环中获得最佳结果。我将用 Java 编写我的项目。

我在想是否可以计算结果?

我的电脑硬件性能低于

Macbook Air 2014 年初

处理器:1.4GHz Intel I5

内存:4GB 1600 MHz DDR3

还有,用什么计算方法算出来?

【问题讨论】:

  • 尝试用较少的迭代次数来计时,然后计算出预期的迭代次数需要多长时间。
  • 我认为你应该更关心在 for 循环体中完成的工作。除了 if 语句增加循环计数器和内存访问也需要时间。这还取决于您选择的编程语言。
  • #1 性能测试规则:测量。那就是:试一试。其他的都是编出来的。
  • 有没有什么网站可以推荐给我看看如何进行性能测试?
  • @PakHoCheung 启动计时器。以少量迭代运行代码。停止计时器。如果您厌倦了等待,请减少迭代次数并重试。

标签: performance if-statement cpu processor


【解决方案1】:

TL;DR:这完全取决于代码,以及编译器生成的 asm 输出。我假设最近的 MacBook 使用 Intel Haswell CPU,所以我以它为例。

更新:我没有注意到你说 Java。把下面文本中的所有不确定性和挥手的东西放在一起,因为一个好的 JIT 编译器会利用动态信息来做一些事情,比如首先检查最常见的条件。优化其实际运行的数据的代码可以产生很大的不同,尤其是。对于一个运行很长时间的小循环。


C 语句到 asm 指令的映射远非 1:1。根据被测试的条件,编译器可能会将一些测试组合在一起,甚至不使用分支。

如果if() 条件中的表达式很复杂,通常需要多条指令来计算它。由&&|| 分隔的每个子句都可能导致单独的条件分支,以实现短路评估。

英特尔 SnB 系列 CPU 可以维持每个时钟 4 微秒的吞吐量。英特尔 Haswell 及更高版本可以在每个 4 到 6 条指令的解码块中对两个比较和分支对进行宏融合(之前的 uarch 中每个周期一个宏融合)。 (参见Agner Fog's microarch pdf,以及 标签wiki 上的其他内容)。因此,理论上,Haswell CPU 每个时钟可以发出 3 个比较和分支指令对。但是,它每个时钟只能执行两个条件分支(只要它们都被正确预测,并且至少有一个未被采用)。

您可以使用性能计数器来查看您的代码是否使端口 6(采用分支)或端口 0 和 6(未采用分支)饱和。或者更有可能的是,您是否因分支错误预测而遭受管道停顿。

查看编译器的 asm 输出是了解编译器如何处理您的代码的第一步。有时它可以帮助您查看可以让特定编译器生成更好代码的源代码更改。有时您可以看到更优化的 asm 流动方式,并且可以以反映这一点的方式编写源代码,这有望对任何编译器有所帮助。

【讨论】:

  • 没关系。我理解你的概念和我应该怎么做。谢谢你的帮助:)
猜你喜欢
  • 2017-09-21
  • 2020-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-18
  • 1970-01-01
相关资源
最近更新 更多