在我正在分析的一个应用程序中,我发现在某些情况下,这个函数能够占用总执行时间的10%以上。
多年来,我一直在讨论如何使用偷偷摸摸的浮点技巧来实现更快的sqrt,但我不知道这样的东西在现代CPU上是否已经过时了。
正在使用MSVC++ 2008编译器,仅供参考...尽管我假设sqrt不会增加太多开销。
有关modf函数的类似讨论,请参阅此处。
编辑:作为参考,this是一种广泛使用的方法,但它实际上要快得多吗?现在SQRT到底有多少个周期?
发布于 2010-04-14 21:42:50
是的,即使没有诡计也是可能的:
11年后的问候。
考虑到这仍然偶尔会得到投票,我想我应该添加一个关于性能的注释,现在更多的是内存访问的戏剧性限制。在优化这样的东西时,你绝对必须使用一个现实的基准测试(理想情况下,你的整个应用程序)--你的应用程序的内存访问模式会对像查找表和缓存这样的解决方案产生巨大的影响,仅仅比较你的优化版本的“周期”会让你误入歧途:将程序时间分配给单独的指令也是非常困难的,而且你的分析工具可能会在这里误导你。
发布于 2010-04-14 23:29:09
这里有一个很好的对照表:http://assemblyrequired.crashworks.org/timing-square-root/
长话短说,SSE2的fsqrt大约比FPU fsqrt快2倍,近似+迭代比FPU fsqrt快4倍(总共8倍)。
此外,如果您尝试采用单精度sqrt,请确保这是您实际得到的结果。我听说过至少有一个编译器会将浮点型参数转换为双精度型,调用双精度sqrt,然后再转换回浮点型。
发布于 2010-04-14 21:32:17
您很可能通过更改算法获得更多的速度改进,而不是通过更改它们的实现:尽量少调用sqrt(),而不是更快地调用。(如果您认为这是不可能的-您提到的对sqrt()的改进只是:对用于计算平方根的算法的改进。)
因为它经常被使用,所以很可能您的标准库的sqrt()实现对于一般情况来说几乎是最优的。除非你有一个受限制的域(例如,如果你需要更低的精度),算法可以采取一些捷径,这是非常不可能有人提出一个更快的实现。
请注意,由于该函数占用了您执行时间的10%,即使您设法提出了一个仅占用std::sqrt()时间的75%的实现,这仍然只会使您的执行时间减少2.5%的。对于大多数应用程序,用户甚至不会注意到这一点,除非他们使用手表进行测量。
https://stackoverflow.com/questions/2637700
复制相似问题