1 秒内大约可以执行多少条 if 语句
How many if statements can be executed in 1 sec approximately
我打算编写一个包含 10 个 for 循环并使用 for 循环超过 10000 次的项目。因此,大约有 10000 * 10^10 个 if 语句。在 for 循环的末尾,有一个结果。我的项目是从 10 个 for 循环中获得最好的结果。我会在Java.
写我的项目
我在想是否可以计算出结果?
我的电脑硬件性能低于
Macbook air 2014 年初
处理器:1.4GHz Intel I5
内存:4GB 1600 MHz DDR3
还有,请问计算方法是什么?
TL;DR:这完全取决于代码,以及编译器生成的 asm 输出。我假设最近的 MacBook 使用 Intel Haswell CPU,所以我以它为例。
更新:我没注意到你说 Java。考虑到下面文本中的所有不确定性和挥手,并将其平方,因为一个好的 JIT 编译器将利用动态信息来做一些事情,比如首先检查最常见的条件。优化它实际上 运行 上的数据的代码可以产生很大的不同,尤其是。对于长时间运行的小循环。
C 语句到 asm 指令的映射远不及 1:1。根据被测试的条件,编译器可能会将一些测试组合在一起,甚至不使用分支。
如果 if()
条件中的表达式很复杂,通常需要多条指令来对其求值。每个由 &&
或 ||
分隔的子句可能会产生一个单独的条件分支,以实现短路评估。
Intel SnB 系列 CPUs 可以维持每个时钟 4 微指令的吞吐量。 Intel Haswell 和更高版本可以在每个 4 到 6 条指令的解码块中宏融合两个比较和分支对(以前的 uarches 中每个周期一个宏融合)。 (参见 Agner Fog's microarch pdf, and other stuff at the x86 标签 wiki)。所以理论上 Haswell CPU 每个时钟可以发出 3 个比较和分支指令对。不过,它每个时钟只能执行两个条件分支(只要它们都被正确预测,并且至少其中一个未被采用)。
您可以使用性能计数器来查看您的代码是否使端口 6(已采用分支)或端口 0 和 6(未采用分支)饱和。或者更有可能的是,您是否因分支预测错误而遭受管道停顿。
查看编译器的 asm 输出是了解编译器可以生成您的代码的第一步。有时它可以帮助您查看源代码更改,这些更改将使特定编译器发出更好的代码。有时您可以看到更优化的 asm 流动方式,并可以以反映该方式的方式编写源代码,这有望对任何编译器有所帮助。
我打算编写一个包含 10 个 for 循环并使用 for 循环超过 10000 次的项目。因此,大约有 10000 * 10^10 个 if 语句。在 for 循环的末尾,有一个结果。我的项目是从 10 个 for 循环中获得最好的结果。我会在Java.
写我的项目我在想是否可以计算出结果?
我的电脑硬件性能低于
Macbook air 2014 年初
处理器:1.4GHz Intel I5
内存:4GB 1600 MHz DDR3
还有,请问计算方法是什么?
TL;DR:这完全取决于代码,以及编译器生成的 asm 输出。我假设最近的 MacBook 使用 Intel Haswell CPU,所以我以它为例。
更新:我没注意到你说 Java。考虑到下面文本中的所有不确定性和挥手,并将其平方,因为一个好的 JIT 编译器将利用动态信息来做一些事情,比如首先检查最常见的条件。优化它实际上 运行 上的数据的代码可以产生很大的不同,尤其是。对于长时间运行的小循环。
C 语句到 asm 指令的映射远不及 1:1。根据被测试的条件,编译器可能会将一些测试组合在一起,甚至不使用分支。
如果 if()
条件中的表达式很复杂,通常需要多条指令来对其求值。每个由 &&
或 ||
分隔的子句可能会产生一个单独的条件分支,以实现短路评估。
Intel SnB 系列 CPUs 可以维持每个时钟 4 微指令的吞吐量。 Intel Haswell 和更高版本可以在每个 4 到 6 条指令的解码块中宏融合两个比较和分支对(以前的 uarches 中每个周期一个宏融合)。 (参见 Agner Fog's microarch pdf, and other stuff at the x86 标签 wiki)。所以理论上 Haswell CPU 每个时钟可以发出 3 个比较和分支指令对。不过,它每个时钟只能执行两个条件分支(只要它们都被正确预测,并且至少其中一个未被采用)。
您可以使用性能计数器来查看您的代码是否使端口 6(已采用分支)或端口 0 和 6(未采用分支)饱和。或者更有可能的是,您是否因分支预测错误而遭受管道停顿。
查看编译器的 asm 输出是了解编译器可以生成您的代码的第一步。有时它可以帮助您查看源代码更改,这些更改将使特定编译器发出更好的代码。有时您可以看到更优化的 asm 流动方式,并可以以反映该方式的方式编写源代码,这有望对任何编译器有所帮助。