当前位置: 首页 > 知识库问答 >
问题:

Oracle vs IBM Java性能

盛嘉
2023-03-14

我试图比较两个主要Java实现的性能:Oracle和IBM运行以下测试:

public class HarmonicSeriesTest {

    public static void main(String[] args) {
        long startTime = System.currentTimeMillis();
        final int limit = 20;
        double sum = 0.0;
        long n = 0;
        while (sum < limit) {
            n++;
            sum += 1.0 / n;
        }
        long duration = System.currentTimeMillis() - startTime;
        System.out.printf("n is %d\n", n);
        System.out.printf("Executed in %d miliseconds\n", duration);
    }
}

通过以下方式运行上述代码:

  1. IBMJRE 1.8.0

java版本“1.8.0”java(TM)SE运行时环境(build pwa6480sr3fp22-20161213\U 02(SR3 FP22))IBM J9 VM(build 2.8,JRE 1.8.0 Windows 10 amd64-64压缩引用20161209\U 329148(JIT启用,AOT启用)J9VM-R28\U 20161209\U 1345\U B329148 JIT-tr.r14。Java语言green\u 20161207\u 128946 GC-R28\u 20161209\u 1345\u B329148\u CMPRSS J9CL-20161209\u 329148)JCL-20161213\u 01基于Oracle jdk8u111-b14

java版本“1.8.0\u 131”java(TM)SE运行时环境(build 1.8.0\u 131-b11)java HotSpot(TM)64位服务器VM(build 25.131-b11,混合模式)

Java版本"1.5.0_22"Java(TM)2运行时环境,标准版(构建1.5.0_22-b03)JavaHotSpot(TM)64位服务器VM(构建1.5.0_22-b03,混合html" target="_blank">模式)

我始终得到以下结果:

  1. IBM JRE 1.8.0编译器合规性级别1.8
n is 272400600
Executed in 1024 miliseconds
n is 272400600
Executed in 2002 miliseconds
n is 272400600
Executed in 1506 miliseconds

如您所见,Oracle JRE比IBM JRE慢100%,比Sun JRE慢25%。Oracle和IBM实现之间的差距很大,而且Oracle JRE看起来像是对Sun JRE的回归。

有人能解释为什么Java的“官方”实现如此缓慢吗?

我对使用JMH没有兴趣,因为我不想对任何东西进行基准测试。

下面是我用于测试的硬件配置:

共有1个答案

胡浩瀚
2023-03-14

首先,我不是一个性能专家,但我和JMH打交道。

最好在像JMH这样的工具中测试它,它可以让你比较苹果和苹果。

不同的Java运行时将更快地启动,并在以后进行优化。例如,可以展开一个循环,热点将进入。

只运行一次测试不会得到准确的样本。i、 e.代码运行得越多,速度就越快。有一个C1、C2、JIT和一系列不同供应商实现的魔术,使代码运行得越来越快。

以下是在JHM中创建项目的步骤,希望能帮助您比较苹果与苹果。

>

mvn-DarchetypeGroupId=组织。openjdk。jmh-DarchetypeArtifactId=jmh java基准原型-DarchetypeVersion=1.18-DarchetypeRepository=http://repo.maven.apache.org/maven2/-DgroupId=com。您的公司-DartifactId=HarmonicSeriest-Dversion=1.0-快照-Dpackage=com。您的公司。HarmonicSeriest-Darchetype。interactive=false--批处理模式原型:generate

构建项目

CD HarmonicSeriesTest/

MVN包

编辑生成的类

编辑MyBenchmark。Java语言

import java.util.concurrent.TimeUnit;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.OutputTimeUnit;

public class MyBenchmark {
    @Benchmark
    @BenchmarkMode(Mode.AverageTime)
    @OutputTimeUnit(TimeUnit.MILLISECONDS)
    public double harmonicSeriesTest() {
        final int limit = 20;
        double sum = 0.0;
        long n = 0;
        while (sum < limit) {
            n++;
            sum += 1.0 / n;
        }
        return sum;
    }

}

4、在命令行上运行项目,而不是在IDE上运行,因为这可能会影响事情

在命令行上执行:

mvn package
cd target
java -jar benchmarks.jar

我的输出。正如您所看到的,第一次迭代很慢,然后又加速了。寻找预热后的第一次迭代,因为这是您应该跨Java实现和使用不同JVM标志进行比较的值。

JMH 1.18 (released 61 days ago)
VM version: JDK 1.8.0_102, VM 25.102-b14
VM invoker: /home/richard/install/java/jdk1.8.0_102/jre/bin/java
VM options: <none>
Warmup: 20 iterations, 1 s each
Measurement: 20 iterations, 1 s each
Timeout: 10 min per iteration
Threads: 1 thread, will synchronize iterations
Benchmark mode: Average time, time/op
Benchmark: com.yourcompany.harmonicseriestest.MyBenchmark.harmonicSeriesTest

Run progress: 0.00% complete, ETA 00:06:40
Fork: 1 of 10
Warmup Iteration   1: 1773.454 ms/op
Warmup Iteration   2: 1782.517 ms/op
Warmup Iteration   3: 1545.739 ms/op
Warmup Iteration   4: 1542.968 ms/op
Warmup Iteration   5: 1530.740 ms/op
Warmup Iteration   6: 1539.304 ms/op
Warmup Iteration   7: 1538.079 ms/op
Warmup Iteration   8: 1535.280 ms/op
Warmup Iteration   9: 1547.716 ms/op
Warmup Iteration  10: 1520.056 ms/op
Warmup Iteration  11: 1503.892 ms/op
Warmup Iteration  12: 1513.037 ms/op
Warmup Iteration  13: 1521.966 ms/op
Warmup Iteration  14: 1519.931 ms/op
Warmup Iteration  15: 1515.179 ms/op
Warmup Iteration  16: 1514.342 ms/op
Warmup Iteration  17: 1525.555 ms/op
Warmup Iteration  18: 1519.022 ms/op
Warmup Iteration  19: 1533.529 ms/op
Warmup Iteration  20: 1525.547 ms/op
Iteration   1: 1524.958 ms/op

注意:这些是测试JVM的黄金样本。微观基准比较棘手,很容易做出“错误”的基准。

还可以看看Nitsan这样的博客和Aleksey Shipilev这样的幻灯片,因为他们真的知道自己在做什么:)。

 类似资料:
  • 概览 首先我们了解一下 YODAOS 的运行时:YODAOS 基于 ShadowNode 它采用事件驱动、非阻塞I/O模型;在设计之初,ShadowNode 的接口与 Node.js 兼容,因此在大部分场景下,开发者可以像 Node.js 一样使用 ShadowNode,了解这些有利于开发者更快速的进行 YODAOS 上的应用开发。 YODAOS 开发应用时,需要关注应用的性能与稳定性,包括但不限

  • 问题内容: 每次执行此查询需要200毫秒以上的时间: 但这每次在第一次查询后每次执行只需要2-3毫秒: 注意在两个查询中相同的ID值。看起来第二个查询使用第一个查询的缓存结果。但是,为什么第一个查询不能使用缓存的结果本身?从第一个查询中删除不会更改任何内容。 当我使用其他ID执行第二个查询时,第一次执行该查询大约需要40毫秒,此后每次需要2-3毫秒。因此,第二个查询不仅运行速度更快,而且还缓存结果

  • 目录 考虑到性能和架构, Redux “可扩展性” 如何? 每个 action 都调用 “所有的 reducer” 会不会很慢? 在 reducer 中必须对 state 进行深拷贝吗?拷贝 state 不会很慢吗? 怎样减少 store 更新事件的数量? 仅有 “一个 state 树” 会引发内存问题吗?分发多个 action 会占用内存空间吗? 缓存远端数据会造成内存问题吗? 性能 考虑到性能

  • Sketch 的性能可以轻松的支持相当复杂的设计,但如果你创作出了一个很大的文件,你可能会想知道有哪些因素影响着 sketch 的性能。 模糊 模糊是非常消耗系统资源的效果。Sketch 需要先将图层渲染成一个位图(这已经很消耗资源了),然后再在上面添加一个模糊(这将更消耗资源),模糊半径越大,消耗的资源也就越大。 一个半径为 1px的模糊,Sketch 需要检查每一个像素周围的每一个像素,也就是

  • 用户希望他们使用的图形界面具有交互性和流畅性,而这正是你需要越来越多地集中时间和精力的地方。 界面不仅要加载快,还要运行良好, 滚动应该很快,动画和交互应该如丝般流畅。 要编写高性能应用程序,你需要了解 LCUI 如何渲染界面,并确保你编写的代码以及第三方代码尽可能高效地运行。 像素管道 “渲染”就是将组件数据转变为像素数据,这个转变如同一条包含很多区域的单向管道,组件数据经过管道中的每个区域的处

  • 性能工具 Reporting: WEIGHTOF.IT Web Page Test GTmetrix Speed Curve [$] Chrome Devtools Timeline sitespeed.io JS tools: ImageOptim-CLI imagemin Budgeting: performancebudget.io

  • jd.onMemoryWarning(function callback) 监听内存不足告警事件,当 iOS/Android 向小程序进程发出内存警告时,触发该事件。 参数 function callback 内存不足告警事件的回调函数 参数 属性 类型 说明 level number 内存告警等级,只有 Android 才有,对应系统宏定义 level 的合法值 值 说明 5 TRIM_MEMO