C++ 功率与手动功率性能的数学比较
我只是想知道C++ 功率与手动功率性能的数学比较,c++,performance,algorithm,time,math.h,C++,Performance,Algorithm,Time,Math.h,我只是想知道math.h库的pow函数是如何工作的,它是实现最简单的顺序算法还是使用其他算法 我只知道重复平方算法,它报告O(logn),也许这就是通过pow函数实现的算法 因此,我只是使用顺序算法vspow进行了一些测试,发现第一个版本的速度几乎是第二个版本的3倍。调用函数真的会对测试的性能造成这么大的影响吗?为什么? 欢迎任何其他解释正在发生什么或如何实现pow的评论 编辑:我错了,pow比顺序算法快3倍。根据ANSI C99标准,第7.12.7.4节: 说明 pow函数计算x提升到y的幂次
math.h
库的pow
函数是如何工作的,它是实现最简单的顺序算法还是使用其他算法
我只知道重复平方算法,它报告O(logn),也许这就是通过pow
函数实现的算法
因此,我只是使用顺序算法vspow
进行了一些测试,发现第一个版本的速度几乎是第二个版本的3倍。调用函数真的会对测试的性能造成这么大的影响吗?为什么?
欢迎任何其他解释正在发生什么或如何实现pow
的评论
编辑:我错了,
pow
比顺序算法快3倍。根据ANSI C99标准,第7.12.7.4节:
说明
pow
函数计算x
提升到y
的幂次。如果x
为有限且为负值,而y
为有限且不是整数值,则会发生域错误。如果x
为零且y
小于或等于零,则可能发生域错误
返回
pow
函数返回x^y
换句话说,它没有指定要使用的确切算法。您必须查看正在使用的C/C++标准库的源代码。我认为大多数库作者都使用了高度优化的算法
更新:在评论中,您说您正在使用MinGW32。这与微软的运行时msvcrt相联系。虽然它不是开源的,但我们知道它使用SSE2。它可能非常有效。在
math.h
中实现pow()
要复杂得多-看看这个免费提供的实现()
重复平方的一个问题是,它不足以处理分数次幂。来自math.h
的pow()
必须处理它,因此在某些测试用例中,它必然较慢。但是,由于重复平方函数不具有相同的功能,因此比较不是一一对应的
一般来说,如果您不需要处理一般情况,则更容易优化性能。例如,如果您从未将数字提高到分数次幂,那么您可能会在微基准测试中生成一个比库函数3:1更好的算法。这需要理解“更快”函数的适用性并没有那么广泛。这完全取决于编写标准库的人。你用哪一种?另外,
pow()
也适用于浮点运算。只需打开math.f文件并检查它?它是源代码,而不是编译的库。它取决于参数。您的pow
可能不太通用,也不太准确。据猜测,在x86上,典型的实现很可能是这样的。我讨厌添加链接,但这似乎是一个很好的资源,因为我也很好奇: