C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了仍然值得尝试在C中为sqrt()创建优化吗?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
用于创建sqrt()的更快实现的旧技巧(查找表,近似函数)是否仍然有用,或者是现代编译器和硬件的认实现?

解决方法

规则1:优化前的配置文件

在投入任何努力以确保您能够击败优化器之前,您必须对所有内容进行分析并发现瓶颈所在的位置.一般来说,sqrt()本身不太可能是你的瓶颈.

规则2:在替换标准函数之前替换算法

即使sqrt()是瓶颈,那么仍然有可能存在算法方法(例如通过长度平方排序距离,这可以在不调用任何数学函数的情况下轻松计算),这可以消除调用sqrt()的需要首先.

如果你什么都不做,编译器会为你做什么

许多现代C编译器都愿意以更高的优化级别内联CRT函数,使得自然表达包括对sqrt()的调用尽可能快.

特别是,我检查了MinGW gcc v3.4.5,并用一个内联代码替换了对sqrt()的调用,该内联代码改组了FPU状态,并且核心使用了FSQRT指令.由于C标准与IEEE 754浮点交互的方式,它必须遵循FSQRT一些代码来检查异常情况并从运行时库调用真正的sqrt()函数,以便浮点异常可以按标准要求由图书馆处理.

使用sqrt()内联并在更大的全双表达式的上下文中使用,结果尽可能高效,因为符合标准并保持完全精度.

对于编译器和目标平台的这种(非常常见的)组合,并且不了解用例,这个结果非常好,并且代码清晰且可维护.

在实践中,任何技巧都会使代码不那么清晰,而且可能的维护性也会降低.毕竟,您宁愿维护(-b sqrt(b * b – 4. * a * C))/(2 * a)还是内联汇编和表的不透明块?

此外,在实践中,您通常可以指望编译器和库作者充分利用您的平台的功能,并且通常比您对优化的细微之处了解更多.

但是,在极少数情况下,可能会做得更好.

一个这样的场合是在计算中你知道你真正需要多少精度,并且知道你不依赖于C标准的浮点异常处理,并且可以与硬件平台提供的东西相提并论.

编辑:我重新安排了一些文本,以强调分析和算法,如Jonathan Leffler在评论中所建议的那样.谢谢,乔纳森.

编辑2:修正了由kmm的锐利眼睛发现的二次例子中的优先错误.

大佬总结

以上是大佬教程为你收集整理的仍然值得尝试在C中为sqrt()创建优化吗?全部内容,希望文章能够帮你解决仍然值得尝试在C中为sqrt()创建优化吗?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。