math.h pow vs手动电源性能

时间:2013-12-31 18:19:32

标签: c++ performance algorithm time math.h

我只是想知道pow库的math.h函数是如何工作的,是实现最简单的顺序算法还是使用其他算法呢?

我只知道重复的平方算法,报告 O(log n),也许这是pow函数实现的算法?

所以我只是使用顺序算法vs pow进行了一些测试,发现第一个版本几乎比第二个版本慢3倍。调用函数真的会惩罚这个测试的性能吗?为什么呢?

欢迎任何其他评论解释正在发生的事情,或pow如何实施。

编辑:我错了,pow比顺序算法快3倍

2 个答案:

答案 0 :(得分:10)

pow()math.h的实施要比这复杂得多 - 请看一下这个免费提供的实现(link)。

重复平方的一个问题是它不足以处理分数幂。来自pow()的{​​{1}}必须处理它,因此在某些测试用例中它必然会变慢。但是,由于重复的平方功能不具有相同的功能,因此比较不是一对一的。

一般来说,如果您不需要处理一般情况,则更容易优化性能。例如,如果您从未将数字提升到分数幂,那么您可能会在微基准测试中创建一个击败库函数3:1的算法。这应该理解“更快”功能的适用性并不宽。

答案 1 :(得分:2)

根据ANSI C99标准,第7.12.7.4节:

  

<强>描述

     

pow函数计算x提升到幂y。如果x为有限且为负且y为有限且不是整数值,则会发生域错误。如果x为零且y小于或等于零,则可能会出现域错误。

     

<强>返回

     

pow个函数返回x^y

换句话说,它没有指定要使用的确切算法。您必须查看您正在使用的C / C ++标准库的源代码。我认为大多数图书馆作者都使用了高度优化的算法。

更新:在评论中,您说您使用的是MinGW32。这与微软的运行时msvcrt有关。虽然它不是开源的,但是看Microsoft’s documentation我们所知道的是它使用的是SSE2。这可能非常有效。