jmh 不能测试 javascript 箭头函数,因其仅支持 jvm 上的 java 字节码,而箭头函数运行于 v8 等 js 引擎,两者执行环境、优化机制完全隔离;如需对比 java 内类似写法(如 for 循环 vs stream),可用 jmh 科学测量。

Java 中没有“箭头函数”概念,这是 JavaScript 的语法特性。JMH 是 Java 专用的微基准测试框架,只能测试 Java 方法(如普通方法、Lambda 表达式、方法引用等),无法测试 JavaScript 函数。
为什么不能测“手写函数声明 vs 箭头函数”?
因为:
- JMH 运行在 JVM 上,只接受 Java 源码编译后的字节码;
- JavaScript 箭头函数运行在 V8 或其他 JS 引擎中,与 JVM 完全隔离;
- 两者语言层、执行环境、优化机制(如 V8 TurboFan vs HotSpot JIT)均不兼容,无法横向对比。
如果你实际想对比的是 Java 中的类似场景
比如:传统 for 循环查找 vs Stream API 查找(常被类比为“显式函数声明 vs 简洁表达式”),那可以用 JMH 科学测量:
- 用
@Benchmark标记不同查找逻辑(如findWithLoop()、findWithStream()、findWithMethodRef()); - 通过
@State(Scope.Benchmark)预热并复用测试数据(避免 GC 和初始化干扰); - 必须使用
Blackhole.consume()防止死码消除——否则 JIT 可能直接跳过整个查找过程; - 配置合理预热(
@Warmup(iterations=5, time=1, timeUnit=TimeUnit.SECONDS))和测量轮次,确保 JIT 已稳定编译。
若真需对比 JS 函数性能
应使用 JavaScript 生态工具:
- 浏览器 DevTools 的 Performance 面板或 console.time()(仅作粗略参考);
- Node.js 下可用
benchmark.js或内置perf_hooks模块; - 注意控制变量:相同输入、关闭无关扩展、禁用调试器、多次运行取中位数。
混淆语言边界是常见误区。JMH 解决的是 Java 方法级性能的可信量化问题,不是跨语言性能裁判员。











