如果等式,预先浮点除法和检查值的效率

时间:2012-01-13 20:38:30

标签: java math optimization floating-point division

我有一种情况,我可能需要将乘数应用于某个值才能获得正确的结果。这涉及使用浮点除法计算值。

我认为在对它们执行浮点逻辑之前检查值是个好主意,以节省处理器时间,但是我不确定它在运行时的效率如何。

我假设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?

当然,在任何一种情况下都不会有任何明显的区别,但是当事情变得处理器变重时,我会对除数等于被除数时浮点乘法的行为感到好奇。

3 个答案:

答案 0 :(得分:5)

假设这是一个非常紧凑的循环,执行了数十亿次,所以1-2指令的区别很重要,否则你可能不会打扰 -

是的,您每次权衡额外检查的成本与检查结果时的节省成本是正确的。但我的猜测是,不仅需要克服额外的开销,而且要引入一个分支,这最终会通过JIT中的CPU中的管道停顿来减慢速度编译代码,否则你将获得。

如果a == 10很多,我想在代码的早期以某种方式利用这种方式有更好更快的方法。

答案 1 :(得分:3)

IIRC,浮点乘法比除法要便宜得多,所以这可能比两者都快:

b *= (a * 0.1);

答案 2 :(得分:1)

如果您最终需要优化此代码,我建议使用Caliper来执行内部循环的微基准测试。很难准确预测这些小修改会产生什么样的影响。特别是在Java中,VM的行为方式有点未知,因为理论上它可以动态优化代码。最好尝试几种策略,看看哪些有效。

http://code.google.com/p/caliper/