如何比较log()和fp分区在C中的性能?

我在C中使用基于日志的类来存储非常小的浮点值(因为值超出了double的范围).当我执行大量的乘法运算时,这将有助于将乘法转换为总和.

但是,在我的算法的某一点上,我需要将一个标准的double值除以一个整数值,而不是将一个* =分配给一个基于日志的值.我已经为基于日志的类重载了* =运算符,并且右侧的值首先通过运行log()被转换为基于日志的值,而不是添加到左侧的值.
因此,实际执行的操作是浮点除法,log()和浮点求和.

我的问题是,首先将分母转换为基于日志的值将会更快,这将取代浮点除法使用浮点减法,产生以下操作链:两次log(),浮点减法,浮点求和.

最后,这归结为浮点除法比log()更快或更慢.我怀疑一个常见的答案是这是编译器和架构依赖,所以我会说,我在darwin 10.3.0上使用了Apple的gcc 4.2.不过,我希望得到一个关于这两个操作符的速度的一般性评论的答案,和/或一个关于如何自己测量差异的想法,因为这里可能会有更多的例子.执行类型转换等的构造函数

干杯!

你多次划分相同的整数吗?如果是这样,你可以乘以1./yourInteger,只能做一次分割.如果可能,这会比两者都快.

至于你的实际问题,它不仅仅是编译器和架构,而且依赖微架构和数据.

在您的特定平台(darwin / x86)上,对于当前硬件i5 / i7:〜24个周期用于除法(1),〜35个周期用于log()(2).然而,由于除法仅使用单个指令分配槽,所以硬件的重新排序引擎可以在划分飞行时进行其他有用的计算;相反,log()在软件中实现,因此处理器将其他计算提升到对数的延迟的机会较少.这意味着在实践中,鸿沟往往会更快一些.

1)从英特尔优化手册

2)通过紧密循环调用log()并使用mach_absolute_time()来获取停留时间来测量.

翻译自:https://stackoverflow.com/questions/2858483/how-can-i-compare-the-performance-of-log-and-fp-division-in-c

转载注明原文:如何比较log()和fp分区在C中的性能?