`

【Java核心-性能基础】Java 微基准测试避坑

    博客分类:
  • Java
 
阅读更多

如何保证微基准测试的正确性(避坑)

在实际应用中,微基准测试的适用性可能并不高。因为微基准测试的测试对象往往比较小。如,两个数据结构、两套算法、某个服务的两种不同实现方式。而为了尽量使测试结果对实际应用有更好的借鉴意义,我们不得不尽量将测试环境模拟得非常像真实环境。但这种费时蹩脚的模拟很可能不如直接将测试对象应用到真实环境中,然后对整个系统进行性能测试,所得结果就是真实环境的性能数据,而不用靠实验性的数据去“推测”真实环境性能。当然,在真实环境执行测试的成本与风险也不低。但通常总好过在满是漏洞的模拟环境中挣扎得出一个不靠谱的结果(完全浪费)。

(《解剖一个有缺陷的微基准测试》)

 

1. 从白盒层面理解代码,理解具体的性能开销

保证基准测试代码符合测试目的,即覆盖目标功能点,是前提。

同时还要了解被测代码在性能开销方面的不同点(包括CPU和内存)

 

2. 测试关注点应较少以保证测试的有效性,也便于诊断问题

也意味着代码运行所需时间较少

 

3. 避免代码执行效率受 JVM 优化影响

Java 微基准测试需要非常了解 JVM 底层机制,避开一些 JVM 特性的影响,从而保证测试结果的准确性。

《解剖一个有缺陷的微基准测试》:https://www.ibm.com/developerworks/java/library/j-jtp02225/

 

3.1 保证代码经过了足够并且合适的预热

一段代码在 JVM 中被执行达到一定次数后,JIT 会将其编译为本地代码:

server 模式下是 10000 次;client 模式下是 1500 次

利用 -XX:+PrintCompilation 输出编译活动细节,可用于判断预热工作需要多久

参数 -Xbatch 可禁止JVM在后台编译代码。这样便于查看编译日志,以免和其它业务日志混在一起

 

当然,预热阶段的代码执行路径必须是和后续采集阶段的路径是相同的。否则就是没预热。

通过观察 PrintCompilation 的输出也可以判断测试后期是否存在不应出现的编译操作。

 

如果存在与预期不一致的编译行为,那么测试结果就是不准确的。

 

3.2 避免 JVM 消除无效代码

如果 JVM 检查某段代码执行与否不会对结果产生影响,它会自动忽略这部分代码。

 

void method1() {
    int a = 1;
    int b = 2;
    int c = a + b;
}

 

解决方法:尽量保持方法有返回值,或使用 JMH 的 Blackhole

 

void method1(Blackhole blackhole) {
    int a = 1;
    int b = 2;
    int c = a + b;
    blackhole.consume(c);
}

 

 

3.3 防止常量折叠

如果 JVM 发现计算过程依赖于常量(或事实上的常量),它会跳过部分代码直接计算结果。

解决方法:使用 JMH 的 State 机制,将本地变量修改为 State 对象信息

 

@State(Scope.Thread)
static class StateX {
    public int a = 1;
    public int b = 2;
}

void method1(StateX state, Blackhole blackhole) {
    int a = state.a;
    int b = state.b;
    int c = a + b;
    blackhole.consume(c);
}

 

 

3.4 避免 GC 操作影响测试准确性

Serial GC 和 Epsilon GC(JDK 11)是值得考虑的微基准测试 GC。

因为这两种 GC 所耗资源较少。

 

*3.5 方法内联对性能也会有影响

可添加启动参数 -XX:+PrintInlining 以便观察内联操作。

如果存在与预期不一致的内联操作,那么测试结果就是不准确的。

分享到:
评论

相关推荐

    Android-Bazel和Gradle的Android基准测试项目

    - **基准测试目的**:基准测试是为了衡量代码性能,通常包括运行时间、内存消耗等方面,帮助开发者优化代码和系统资源使用。 - **JUnit4和BenchmarkDotNet**:在Android中,可以使用JUnit4的@Benchmark注解进行...

    JMH - Java 微基准测试工具(自助性能测试)完整可运行代码

    Java Micro Benchmark Harness(简称JMH)是Oracle JDK项目的一个子项目,它提供了一套用于开发、执行和分析Java和Java虚拟机(JVM)微基准测试的框架。JMH的目标是帮助开发者正确地进行性能测试,避免常见的陷阱,...

    微基准测试工具:jmh

    JMH,全称为Java Micro Benchmark Harness,是由Oracle公司开发的一个强大的性能测试框架,专用于进行微基准测试。这个工具旨在帮助Java开发者精确地测量代码片段、方法或者整个程序的性能,以便优化和理解代码执行...

    使用JMH进行微基准测试不要猜,要测试!Java开发Jav

    总结来说,JMH为Java开发提供了强大而精准的微基准测试能力,它使得性能优化不再是盲目的猜测,而是基于数据的决策。通过学习和实践JMH,开发者能够更好地理解和改进代码的性能,从而实现项目的高效运行。

    caliper,面向java的微基准测试库.zip

    总之,Caliper是一个强大的Java微基准测试工具,它简化了性能测试的流程,帮助开发者深入理解代码的运行时性能,从而实现更高效的代码优化。如果你在Java项目中遇到性能问题,或者想要比较不同实现的性能,Caliper...

    Collections源码java-java-source-benchmarks:一组用于基准测试分析的开源Java程序

    《Java集合框架源码分析与性能基准测试》 在Java编程语言中,集合框架是核心库的重要组成部分,它提供了一套高效、灵活的数据结构和算法,使得开发者能够方便地存储和管理各种数据。本篇文章将深入探讨Java集合框架...

    关于JMH(Java Microbenchmark Harness)微基准测试的使用说明.zip

    Java Microbenchmark Harness(JMH)是Oracle公司开发的一个用于创建、执行和分析Java微基准测试的框架。这个框架使得开发者可以有效地评估代码片段在不同条件下的性能,从而优化应用程序的性能。下面将详细介绍JMH...

    java性能优化教程

    编写基准测试,通过JMH(Java Microbenchmark Harness)进行微基准测试,确保优化措施有效且不会引入新的问题。 总的来说,Java性能优化涉及代码质量、JVM配置、并发处理、IO操作等多个方面。通过深入理解和实践,...

    java-14-openjdk-14.0.2.12-1.windows.redhat.x86_64.zip

    7. **Microbenchmark Harness Enhancements**:Java 14进一步改进了微基准测试框架,提供了更好的基准测试结果的准确性和可靠性。 8. **其他改进**:除了上述主要特性外,Java 14还包括了许多性能优化、错误修复和...

    Prentice Hall - Java Performance

    6. **微基准测试**:正确地进行微基准测试有助于避免误导性的结论,确保编写出高性能的应用程序。 7. **实践中的案例分析**:通过实际案例的学习,读者可以更好地理解和应用上述理论和技术。 综上所述,《Java™ ...

    数据库性能基准测试 DB-Webbench.zip

    数据库性能基准测试是评估数据库系统在特定工作负载下运行效率的重要方法。DB-Webbench 是一个专门为这个目的设计的工具,它专注于模拟真实的博客应用环境,以测量数据库系统的响应速度和处理能力。Webbench 本身是...

    java performance, the definitive guide

    微观基准测试是指针对Java虚拟机内部的特定功能和性能指标进行的测试,而宏观基准测试则更接近实际应用的运行环境,用于评估应用程序整体的性能表现。中观基准测试介于两者之间,它关注应用程序中的某一个模块或子...

    在Java 21上使用虚拟线程运行JDK HTTP服务器的基准测试.zip

    在这个基准测试中,我们专注于探讨如何利用Java 21的虚拟线程来优化JDK内置HTTP服务器的性能。 首先,虚拟线程的核心概念在于它们能够透明地将线程管理的工作交给JVM,而不是依赖于操作系统的线程管理。这意味着...

    narjillos-math-bench:Narjillos 的简单基准测试

    JMH是Oracle公司开发的一个强大的微基准测试框架,它为Java开发者提供了丰富的功能,包括生成可重复的、准确的性能数据,以及分析结果的能力。通过JMH,Narjillos-math-bench能够对各种数学运算进行微调,确保测试...

    java性能调优文档(sun)

    2. **基准测试**:在进行任何调优之前,先对当前系统的性能进行基准测试,以便后续对比改进效果。 3. **监控工具**:利用JMX(Java Management Extensions)、VisualVM等工具实时监控系统状态,收集必要的性能数据。...

    1、kafka(2.12-3.0.0)介绍、部署及验证、基准测试

    进行基准测试可以帮助评估 Kafka 集群的性能,包括消息生产和消费速率、延迟、资源利用率等。这通常通过专用的测试工具完成,例如 Kakfa 的性能测试工具 `kafka-producer-perf-test.sh` 和 `kafka-consumer-perf-...

    java-fork-join:Java fork中的八个基准测试

    在“java-fork-join:Java fork中的八个基准测试”项目中,开发者可能对Fork/Join框架进行了深度的性能评估,以理解其在不同场景下的效率。下面将详细介绍Java Fork/Join框架及其核心概念。 1. **Fork/Join框架概述*...

    yardstick-cassandra:Apache Cassandra 的基准测试

    "Yardstick-Cassandra" 是一个专门针对 Apache Cassandra 进行基准测试的项目,它旨在评估和比较 Cassandra 在不同环境和配置下的性能表现。这个项目对于开发者、运维人员以及对优化 Cassandra 集群性能感兴趣的任何...

Global site tag (gtag.js) - Google Analytics