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