java jdk 1.7.0_java – 从jdk1.7.0_25迁移到jdk1.7.0_40时的性能回归

看起来问题是由于在

JDK-7133857完成的工作,其中java.lang.Math.pow()和java.lang.Math.exp()被内化并使用x87计算。

这些方法在分析应用程序中广泛使用(!),因此具有相当大的效果。

JDK-8029302描述和修正了2个输入的权力问题;并且使用jdk1.8.0_25(其中修复了问题)的应用程序的测试显示改进的性能,尽管在内化完成之前并未回到jdk1.7.0_25的较高级别。

以下是我的JMH基准测试及其在三个相关JDK版本上的Math.pow()的结果:

package org.sample;

import org.openjdk.jmh.annotations.*;

import java.lang.*;

public class MyBenchmark {

@State(Scope.Benchmark)

public static class ThreadState {

volatile double x = 0;

volatile double y = 0;

}

@Benchmark

@BenchmarkMode(Mode.Throughput)

public double powx(ThreadState state) {

state.x++;

state.y += 0.5;

return Math.pow(state.x, state.y);

}

@Benchmark

@BenchmarkMode(Mode.Throughput)

public double pow3(ThreadState state) {

state.x++;

return Math.pow(state.x, 3);

}

@Benchmark

@BenchmarkMode(Mode.Throughput)

public double pow2(ThreadState state) {

state.x++;

return Math.pow(state.x, 2);

}

}

结果:

Intel(R)Core(TM)i5-2520M CPU @ 2.50GHz

jdk1.7.0_25 – 内化前

# VM invoker: x:\@sdks\jdks\jdk1.7.0_25\jre\bin\java.exe

...

Result: 4877658.355 (99.9%) 330460.323 ops/s [Average]

Statistics: (min, avg, max) = (1216417.493, 4877658.355, 6421780.276), stdev = 1399189.700

Confidence interval (99.9%): [4547198.032, 5208118.678]

# Run complete. Total time: 00:24:48

Benchmark Mode Samples Score Score error Units

o.s.MyBenchmark.pow2 thrpt 200 40160618.138 1561135.596 ops/s

o.s.MyBenchmark.pow3 thrpt 200 3678800.153 88678.269 ops/s

o.s.MyBenchmark.powx thrpt 200 4877658.355 330460.323 ops/s

jdk1.7.0_40 – 内化

# VM invoker: x:\@sdks\jdks\jdk1.7.0_40\jre\bin\java.exe

...

Result: 1860849.245 (99.9%) 94303.387 ops/s [Average]

Statistics: (min, avg, max) = (418909.582, 1860849.245, 2379936.035), stdev = 399286.444

Confidence interval (99.9%): [1766545.859, 1955152.632]

# Run complete. Total time: 00:24:48

Benchmark Mode Samples Score Score error Units

o.s.MyBenchmark.pow2 thrpt 200 9619333.987 230749.333 ops/s

o.s.MyBenchmark.pow3 thrpt 200 9240043.369 238456.949 ops/s

o.s.MyBenchmark.powx thrpt 200 1860849.245 94303.387 ops/s

jdk1.8.0_25 – 固定内在化

# VM invoker: x:\@sdks\jdks\jdk1.8.0_25\jre\bin\java.exe

...

Result: 1898015.057 (99.9%) 92555.236 ops/s [Average]

Statistics: (min, avg, max) = (649562.297, 1898015.057, 2359474.902), stdev = 391884.665

Confidence interval (99.9%): [1805459.821, 1990570.293]

# Run complete. Total time: 00:24:37

Benchmark Mode Samples Score Score error Units

o.s.MyBenchmark.pow2 thrpt 200 81840274.815 1979190.065 ops/s

o.s.MyBenchmark.pow3 thrpt 200 9441518.686 206612.404 ops/s

o.s.MyBenchmark.powx thrpt 200 1898015.057 92555.236 ops/s

如果我正在阅读这个权利,那么在2007年的2号问题的权力肯定是固定的,而且在2年的时候,我已经在jdk1.7.0_40中提升了> 2 ints(我刚刚测试过Math.pow(x,3))的性能。至于上面在powx()基准测试中完成的奇怪的非线性Math.pow(),在从jdk1.7.0_25移动到jdk1.7.0_40时似乎仍然有相当的性能回归(> 3x)。

用org.apache.commons.math3.util.FastMath中各自的方法替换Math.pow()和Math.exp(),完全解决了性能提高的问题 – 就我而言,这是正确的解决方案。

注意:如果有一个简单的方法(即不需要构建JDK)设置-XX:-InlineIntrinsics标志,这将会变得更简单。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值