为什么浮点运算被认为是昂贵的?

Sid*_*tha 2 profiling flops

我读到gprof(函数分析)和其他分析方法可以返回执行程序时发生的浮点运算的数量,因此想知道Flops如何比常规运算贵得多?

Rob*_*ert 9

我假设你在谈论x86,但是下面的很多内容同样适用于其他架构

浮点运算很昂贵,因为浮点数上的操作比整数上的操作要昂贵得多.就这么简单.整数格式使得加法和减法在硬件中实现起来非常简单.浮点数(几乎总是)在IEEE 754中实现,它将数字存储为符号,指数和尾数,这允许表示非常大和非常小的数字,但它以运算速度为代价.如果数字只有3位小数,则可以使用整数,最后除以3; 广泛的精度使事情复杂化.

话虽这么说,现代处理器的浮点数比过去好.浮点数学最初是在可选的协处理器上实现的 - 特别是Intel 80387--它只能通过特殊指令访问.您将值推送到x87堆栈,执行操作,然后将其弹回硬件寄存器.很慢,因为它不得不离开处理器.更重要的是,这些特定的操作变得"冒险"使用,因为你不能确定处理器是否存在 - 如果不存在,你的程序会工作,但它会使用模拟协处理器的软件例程.如果你是一个游戏开发者并且你不能依赖,比如反平方根快,你可以自己完成工作,并且你在所有系统上运行同样快 - 在某些系统上运行速度不是很快,而在其他.

如今,处理器具有专为性能而设计的特殊浮点运算,更重要的是,保证在那里.所以它们非常快,虽然浮点运算不可避免地比整数运算慢,但它们通常不足以解决它 - 特别是以牺牲错误和复杂性为代价.更重要的是,这个答案表明,在大多数情况下,这是一个洗涤.

在任何情况下,性能现在已经足够好以至于旧的格言开始了 - 程序员时间比机器时间更重要,并且你肯定会花费更多的时间来编写一些花哨的算法来避免浮点数而不是仅使用他们.