Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 浮点除法的效率和预先检查值(如果eq_Java_Math_Optimization_Floating Point_Division - Fatal编程技术网

Java 浮点除法的效率和预先检查值(如果eq

Java 浮点除法的效率和预先检查值(如果eq,java,math,optimization,floating-point,division,Java,Math,Optimization,Floating Point,Division,在这种情况下,为了得到正确的结果,我可能需要对某个值应用乘数。这涉及到使用浮点除法计算值 我认为在对这些值执行浮点逻辑之前检查它们是一个好主意,以节省处理器时间,但是我不确定在运行时这两种方式的效率如何 我假设if检查是1或2条指令(从汇编类开始已经有一段时间了),并且浮点操作将远不止这些 //Check if (a != 10) { //1 or 2 instructions? b *= (float) a / 10; //Many instructi

在这种情况下,为了得到正确的结果,我可能需要对某个值应用乘数。这涉及到使用浮点除法计算值

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

我假设
if
检查是1或2条指令(从汇编类开始已经有一段时间了),并且浮点操作将远不止这些

//Check 
if (a != 10) {              //1 or 2 instructions?
    b *= (float) a / 10;    //Many instructions?
}
a
在大多数情况下都是“10”,但也有一些情况下不会是。即使
a
等于除数,浮点除法是否也需要很多个周期

带有
if
语句的前一个代码执行效率会比不带该语句的下一个代码更高吗

//Don't check
b *= (float) a / 10;    //Many instructions?

尽管两种方式都不会有任何明显的差异,但我对除数等于被除数的浮点乘法的行为感到好奇,以防处理器负担过重。

假设这是在一个非常紧密的循环中,执行了数十亿次,所以1-2指令的差异很重要,否则你可能就不必麻烦了--

是的,你每次权衡额外支票的成本是对的,当支票是真的时,你会权衡节省的成本。但我的猜测是,这必须是真的,不仅要克服额外的开销,还要克服引入分支这一事实,这最终会通过JIT编译代码中CPU的管道暂停来降低速度,而不是通过其他方式


如果
a==10
很多,我想在代码的早期,有一种更好更快的方法来利用它。

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

b *= (a * 0.1);

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


您是否尝试过两个版本的微基准测试?不,还没有,我会在测试时更新我的问题,首先进行基准测试,以确定这是否重要;如果没有,做最简单的事情。这就是说:分支未命中应该比除法更昂贵,因此除非分支具有高度可预测性,否则检查不值得。如果你能接受这样一个事实,即这与除法10不完全相同,则+1用于将检查重新分解为一个代码流量较小的区域。。