我读到gprof(函数评测)和其他评测方法可以返回程序执行中发生的浮点运算的数量,因此我想知道浮点运算怎么比常规运算贵得多?
我假设您谈论的是x86,但下面的许多内容同样适用于其他架构
浮点运算是昂贵的,因为对浮点数字的运算比对整数的运算要昂贵得多。就这么简单。整数的格式使得加法和减法在硬件中实现起来非常简单。浮点数(几乎总是)在IEEE 754中实现,它将数字存储为符号、指数和尾数,允许表示非常大和非常小的数字,但这是以运算速度为代价的。如果数字只有小数点后3位,你可以使用整数,并在末尾除以3;精度范围之广使事情复杂化。
话虽如此,现代处理器使用浮点数字比过去更好。浮点数学最初是在可选的协处理器上实现的,尤其是英特尔80387,它只能通过特殊指令访问。您可以将值推送到x87堆栈上,执行一个操作,然后将其弹回到硬件寄存器中。非常慢,因为它必须离开处理器。更重要的是,这些特定操作的使用变得"有风险",因为你不能确定处理器是否存在——如果它不存在,你的程序就会工作,但它会使用模拟协处理器的软件例程。如果你是一名游戏开发人员,你不能依赖于,比如说,平方倒数的速度很快,你可以自己做这项工作,你在所有系统上都会同样快地运行——有些系统不会快一点,其他系统会慢得多。
如今,处理器有专门为性能而设计的浮点运算,更重要的是,它保证了性能。因此,它们非常快,虽然浮点运算不可避免地比整数运算慢,但它们通常不足以解决问题,尤其是以bug和复杂性为代价。更重要的是,这个答案表明,在大多数情况下,这是一次清洗
无论如何,性能现在已经足够好了,这句老话开始流行了——程序员的时间比机器的时间更重要,你肯定会花更多的时间来编程一些避免浮点数的奇特算法,而不是仅仅使用它们。