我正在尝试测试一些队列插入和对象时间戳的删除。经过几次测试运行后,我在相同代码上的结果显着提高了 80 倍。这显然是 JVM 或 hardware\cpu 缓存的缓存结果,但我希望每次运行都能获得新的结果。
有没有办法从 Java 代码中以编程方式清除这两个缓存?
这可能是由于JIT的作用。JIT 会在运行一定次数后将您的字节码编译为机器码,以提高效率。
-XX:CompileThreshold
您可以通过设置选项(默认值为 10,000)或将您的类完全排除在优化之外来更改方法优化之前的调用次数。
但是我不确定你为什么要禁用编译器并强制你的程序运行得更慢。
如果你想设计一个微基准,我建议使用 JMH。
它是“最”的微基准测试框架,它将负责 JIT 预热、死代码消除等。它还对包括 Linux Perf 在内的各种分析器提供开箱即用的支持。