如果必须计算给定int值的一小部分,请说:
int j = 78;
int i = 5* j / 4;
Run Code Online (Sandbox Code Playgroud)
这比做的更快:
int i = 1.25*j; // ?
Run Code Online (Sandbox Code Playgroud)
如果是,是否存在可用于决定使用哪个转换因子的转换因子,例如int可以在同一时间内进行多次除法一次float乘法?
编辑:我认为评论清楚表明浮点数学会慢一点,但问题是,多少?如果我需要float用$ N $ intdiv 替换每个乘法,那么$ N $将不再值得吗?
你已经说过所有的价值都是动态的,这会产生不同.对于特定值5 * j / 4,整数操作将非常快,因为最糟糕的情况是编译器将它们优化为两个班次和一个加法,加上一些混乱以应对可能性j为负.如果CPU可以做得更好(单周期整数乘法或其他),那么编译器通常会知道它.当您编译一大类CPU(例如,生成最低公分母ARM代码)时,编译器优化此类事物的能力的限制基本上就会出现,编译器对此并不太了解硬件,因此不能总是做出好的选择.
我想,如果a和b是固定的一段时间(但在编译时不知道),那么它可能是计算k = double(a) / b一次,然后int(k * x)对于许多不同的值x,可能会比计算更快a * x / b了许多不同的值x.我不会指望它.
如果所有值每次都变化,那么计算浮点除法1.25,然后进行浮点乘法,似乎不会比整数乘法后跟整数除法更快.但你永远不知道,测试它.
在现代处理器上为此提供简单的相对时序是不可能的,它实际上很大程度上取决于周围的代码.代码中的主要成本通常不是"实际"操作:它是"隐形"的东西,比如指令管道停止依赖,或者将寄存器溢出到堆栈或函数调用开销.是否可以内联执行此功能的功能可能比功能实际执行的功能更容易产生差异.就性能的确定性陈述而言,您基本上可以测试实际代码或关闭.但是,如果你的值以整数开始,那么对它们进行整数运算将比转换为double并执行类似数量的运算更快double.
| 归档时间: |
|
| 查看次数: |
5272 次 |
| 最近记录: |