JuliaPerf / JuliaPerf/LinuxPerf.jl

`reset!` causes incorrect scaling for `Stats`

Open
#54 1 comment 0 reactions 0 assignees View on GitHub
Dominant language
Julia
Stars
53
Forks
9
PR merge metrics
No merged PRs in 30d

Description

```julia
julia> bench = LinuxPerf.make_bench();
julia> enable!(bench); sleep(1.0); disable!(bench);
julia> stats = LinuxPerf.ThreadStats(bench);
julia> stats.groups[1][1]
LinuxPerf.Counter(hw:cycles, 0x0000000001bdc0f6, 0x0000000000a08a80, 0x00000000007a6ed7)

julia> reset!(bench)
julia> stats = LinuxPerf.ThreadStats(bench);
julia> stats.groups[1][1]
LinuxPerf.Counter(hw:cycles, 0x0000000000000000, 0x0000000003dad501, 0x00000000026bd3ce)
```

Notice that `IOC_RESET` resets the value of the counter, but doesn't affect `time_enabled` or `time_running`

It's hard to say what the correct behavior is here, but this means that the `Counter` object is no longer valid because its running / enabled ratio is not what it thinks it is:
```julia
julia> stats
╶ cpu-cycles 0.00e+00 76.3% # 0.0 cycles per ns
┌ cache-references 0.00e+00 62.0%
└ cache-misses 0.00e+00 62.0% # NaN% of cache refs
┌ branch-instructions 0.00e+00 61.8% # NaN% of insns
│ branch-misses 0.00e+00 61.8% # NaN% of branch insns
└ instructions 0.00e+00 61.8% # NaN insns per cycle
┌ context-switches 0.00e+00 100.0%
│ page-faults 0.00e+00 100.0%
│ minor-faults 0.00e+00 100.0%
│ major-faults 0.00e+00 100.0%
└ cpu-migrations 0.00e+00 100.0%
```

If you try to reset in a loop, this means you end up scaling the measurement by its average running time instead of its true running time for the latest sample.

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.