• Jin Yao's avatar
    perf stat: Improve runtime stat for interval mode · 197ba86f
    Jin Yao authored
    For interval mode, the metric is printed after the '#' character if it
    exists. But it's not calculated by the counts generated in this
    interval.
    
    See the following examples:
    
      root@kbl-ppc:~# perf stat -M CPI -I1000 --interval-count 2
      #           time             counts unit events
           1.000422803            764,809      inst_retired.any          #      2.9 CPI
           1.000422803          2,234,932      cycles
           2.001464585          1,960,061      inst_retired.any          #      1.6 CPI
           2.001464585          4,022,591      cycles
    
    The second CPI should not be 1.6 (4,022,591/1,960,061 is 2.1)
    
      root@kbl-ppc:~# perf stat -e cycles,instructions -I1000 --interval-count 2
      #           time             counts unit events
           1.000429493          2,869,311      cycles
           1.000429493            816,875      instructions              #    0.28  insn per cycle
           2.001516426          9,260,973      cycles
           2.001516426          5,250,634      instructions              #    0.87  insn per cycle
    
    The second 'insn per cycle' should not be 0.87 (5,250,634/9,260,973 is
    0.57).
    
    The current code uses a global variable 'rt_stat' for tracking and
    updating the std dev of runtime stat. Unlike the counts, 'rt_stat' is not
    reset for interval. While the counts are reset for interval.
    
      perf_stat_process_counter()
      {
              if (config->interval)
                      init_stats(ps->res_stats);
      }
    
    So for interval mode, the 'rt_stat' variable should be reset too.
    
    This patch resets 'rt_stat' before read_counters(), so the runtime stat
    is only calculated by the counts generated in this interval.
    
    With this patch:
    
      root@kbl-ppc:~# perf stat -M CPI -I1000 --interval-count 2
      #           time             counts unit events
           1.000420924          2,408,818      inst_retired.any          #      2.1 CPI
           1.000420924          5,010,111      cycles
           2.001448579          2,798,407      inst_retired.any          #      1.6 CPI
           2.001448579          4,599,861      cycles
    
      root@kbl-ppc:~# perf stat -e cycles,instructions -I1000 --interval-count 2
      #           time             counts unit events
           1.000428555          2,769,714      cycles
           1.000428555            774,462      instructions              #    0.28  insn per cycle
           2.001471562          3,595,904      cycles
           2.001471562          1,243,703      instructions              #    0.35  insn per cycle
    
    Now the second 'insn per cycle' and CPI are calculated by the counts
    generated in this interval.
    Signed-off-by: default avatarJin Yao <yao.jin@linux.intel.com>
    Acked-by: default avatarJiri Olsa <jolsa@redhat.com>
    Tested-By: default avatarKajol Jain <kjain@linux.ibm.com>
    Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    Cc: Andi Kleen <ak@linux.intel.com>
    Cc: Jin Yao <yao.jin@intel.com>
    Cc: Kan Liang <kan.liang@linux.intel.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Link: http://lore.kernel.org/lkml/20200420145417.6864-1-yao.jin@linux.intel.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    197ba86f
builtin-stat.c 58.2 KB