【发布时间】:2011-10-16 14:17:19
【问题描述】:
两者之间的 CPU 周期(或者本质上是“速度”)有什么区别
x /= y;
和
#include <cmath>
x = sqrt(y);
编辑:我知道操作并不相同,我只是随意提出x /= y 作为x = sqrt(y) 的基准
【问题讨论】:
-
高度依赖于编译器、配置和目标CPU。
-
虽然比较两个不同的操作可能听起来很奇怪,但这绝对是可能的(即使平台依赖并且很难做到正确)。在进行低级优化时,了解基本浮点运算的近似相对速度很重要。有时您可以通过乘以 4 并除以 3 或乘以 2 并执行平方根 2 来解决相同的问题,例如(人工示例)。
-
伙计们,虽然不完全清楚,但我相信这是一个真实的问题。 @Matt:在没有专用硬件的不太强大的系统上, sqrt 通常比 div 慢 x10。在这十年的任何硬件上,它们都非常接近,并且经常通过流水线组合成类似的浮点性能。您可以搜索特定处理器上的 CPU 时序以获得更好的感觉。
-
在这里friweb.hu/instlatx64 您可以找到所有 x86 指令的测量时序(ns 和滴答声)。例如。对于 Core 2 Duo E6700,x87 sqrt 操作的延迟 (L) 为 32 位浮点数的 29 个滴答; 64 位双精度数为 58 个刻度,80 位长双精度数为 69 个刻度; 32/64 位压缩浮点的 SSE/SSE2 时间相同(29 和 58 滴答声)。对于 F.P.分频:32bit=18clock; 64位=32时钟; 80bit=38 滴答; x87 和 SSE/SSE2 的 32/64 位相同。在您的操作中加载和存储一个值,必须另外计算。这应该是答案,但有些人关闭了这个很好的 Q。
-
@Mat 但是在某些情况下可以避免计算平方根。
标签: c++ complexity-theory sqrt cpu-cycles cpu-time