有些场景, 我们需要人工的制造一点耗时出来,

    现实世界中, 我们看统计信息, 需要掺杂一些特殊的信息
    (伪计数, 数据平滑, 缓冲数)
    来让我们的报表更加符合我们想要观察的维度

    比如现在有两个算法,
    算法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的时间片呢?
    看代码

    1. @Benchmark
    2. public void consume_0000() {
    3. Blackhole.consumeCPU(0);
    4. }

    我们通过执行 这个静态方法, 强行让CPU工作一段时间

    入参tokens是一个int值,
    等于1不代表就是消耗一个时间片;
    但是 从宏观上来看, 这个入参 tokens 与消耗的时间片是线性的对应关系
    也就是说, 这个是用来做相对比较的