有些场景, 我们需要人工的制造一点耗时出来,
现实世界中, 我们看统计信息, 需要掺杂一些特殊的信息
(伪计数, 数据平滑, 缓冲数)
来让我们的报表更加符合我们想要观察的维度
比如现在有两个算法,
算法1算出来的数值是 1ns/ops ; 但是实现特别麻烦, 还难以维护
算法2算出来的数值是 100ns/ops; 实现非常简单, 易于维护, 有优化空间
虽然乍一看100倍的执行效率优势, 其他方面再不行也无所谓了
那你是不是就可以说用了算法1真实的业务场景 效率提升了100倍呢?
但在真实环境里, 可能这个算法是配合其他代码一起执行的, 完全不会单独被执行
真实环境的耗时 = 算法耗时 + 其他业务处理
我们如果能模拟其他业务处理的耗时, 再看看报表是不是能更好的评估呢?
假设这里我们模拟其他业务处理 耗时500ns/ops
算出来的两个结果
第一个benchmark耗时 = 500 + 1 ns/ops
第二个耗时 = 500 + 100 ns/ops
是不是差距就不那么大了?
然后我们再综合评估用算法1还是算法2
那我们怎么写这种模拟的业务处理耗时呢?
一种最简单的想法是使用Sleep函数, 直接睡500ns
但是sleep会有很多缺点, 比如时间片完全让出了, 其他线程有更多时间片, 比如上下文切换耗时增加….等等, 使用sleep就意味着结果的不稳定性
所以我们并不想使用sleep这种操作
那我们怎么样写代码, 可以让JMH的benchmark消耗一些CPU的时间片呢?
看代码
@Benchmark
public void consume_0000() {
Blackhole.consumeCPU(0);
}
我们通过执行 这个静态方法, 强行让CPU工作一段时间
入参tokens是一个int值,
等于1不代表就是消耗一个时间片;
但是 从宏观上来看, 这个入参 tokens 与消耗的时间片是线性的对应关系
也就是说, 这个是用来做相对比较的