我有一种情况,我可能需要将乘数应用于某个值才能获得正确的结果。这涉及使用浮点除法计算值。
我认为在对它们执行浮点逻辑之前检查值是个好主意,以节省处理器时间,但是我不确定它在运行时的效率如何。
我假设if
检查是1或2条指令(自汇编类以来已经有一段时间了),并且浮点运算将远远多于此。
//Check
if (a != 10) { //1 or 2 instructions?
b *= (float) a / 10; //Many instructions?
}
值a
大部分时间都是'10',但是有一些情况不会出现。即使a
等于除数,浮点除法是否会花费很多周期?
前面带有if
语句的代码是否会比没有?{/ p>的下一个代码更有效地执行
//Don't check
b *= (float) a / 10; //Many instructions?
当然,在任何一种情况下都不会有任何明显的区别,但是当事情变得处理器变重时,我会对除数等于被除数时浮点乘法的行为感到好奇。
答案 0 :(得分:5)
假设这是一个非常紧凑的循环,执行了数十亿次,所以1-2指令的区别很重要,否则你可能不会打扰 -
是的,您每次权衡额外检查的成本与检查结果时的节省成本是正确的。但我的猜测是,不仅需要克服额外的开销,而且要引入一个分支,这最终会通过JIT中的CPU中的管道停顿来减慢速度编译代码,否则你将获得。
如果a == 10
很多,我想在代码的早期以某种方式利用这种方式有更好更快的方法。
答案 1 :(得分:3)
b *= (a * 0.1);
答案 2 :(得分:1)
如果您最终需要优化此代码,我建议使用Caliper来执行内部循环的微基准测试。很难准确预测这些小修改会产生什么样的影响。特别是在Java中,VM的行为方式有点未知,因为理论上它可以动态优化代码。最好尝试几种策略,看看哪些有效。