我打算编写一个包含10个for循环的项目,并使用for循环超过10000次。因此,如果语句大约有10000 * 10 ^ 10。在for循环结束时,有一个结果。我的项目是从10个for循环中获得最佳结果。我将用Java编写我的项目。
我在想是否有可能计算结果?
我的电脑硬件性能低于
Macbook air 2014年初
处理器:1.4GHz Intel I5
内存:4GB 1600 MHz DDR3
另外,找出它的计算方法是什么?
答案 0 :(得分:1)
TL; DR:这完全取决于代码,以及编译器输出的asm输出。我假设最近MacBook使用Intel Haswell CPU,所以我以此为例。
更新:我没注意到你说过Java。在下面的文本中采取所有的不确定性和挥手,并将其平方,因为一个好的JIT编译器将利用动态信息来执行诸如首先检查最常见的条件之类的东西。优化其实际运行的数据的代码可以产生很大的不同,尤其是。对于一个运行很长时间的小循环。
将C语句映射到asm指令远不及1:1。根据所测试的条件,编译器可能会将一些测试组合在一起,或者甚至不使用分支。
如果if()
条件中的表达式很复杂,通常需要多条指令来评估它。由&&
或||
分隔的每个子句可能会产生一个单独的条件分支,以实现短路评估。
Intel SnB系列CPU每个时钟可以承受4个uop的吞吐量。英特尔Haswell以及后来的宏可以在4到6条指令的每个解码块中对两个比较和分支对进行宏熔合(在之前的搜索中每个周期从一个宏融合开始)。 (请参阅Agner Fog's microarch pdf以及x86代码wiki上的其他内容)。因此理论上Haswell CPU每个时钟可以发出3个比较和分支指令对。但是它每个时钟只能执行两个条件分支(只要它们都被正确预测,并且至少其中一个不被采用)。
您可以使用性能计数器来查看您的代码是饱和端口6(采用分支)还是端口0和6(未采用分支)。或者更可能的是,你是否因为分支机构误预测而遭受管道停滞。
查看编译器的asm输出是了解编译器可以对代码进行哪些操作的第一步。有时它可以帮助您查看源更改,这将使特定编译器发出更好的代码。有时您可以看到asm流动的更优化方式,并且可以以反映该方式的方式编写源代码,这有望帮助任何编译器。