diff options
Diffstat (limited to 'internal/statsengine/syscall.go')
| -rw-r--r-- | internal/statsengine/syscall.go | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/internal/statsengine/syscall.go b/internal/statsengine/syscall.go index 4feeab2..93931d1 100644 --- a/internal/statsengine/syscall.go +++ b/internal/statsengine/syscall.go @@ -1,9 +1,10 @@ package statsengine import ( + "cmp" "math" - "math/rand" - "sort" + "math/rand/v2" + "slices" "time" "ior/internal/event" @@ -55,15 +56,17 @@ type syscallSnapshotInput struct { } func newSyscallAccumulator() *syscallAccumulator { - return newSyscallAccumulatorWithConfig(syscallReservoirSampleCapDefault, rand.New(rand.NewSource(time.Now().UnixNano()))) + return newSyscallAccumulatorWithConfig(syscallReservoirSampleCapDefault, nil) } +// newSyscallAccumulatorWithConfig creates a syscall accumulator with the given +// sample capacity and optional RNG. A nil rng uses the auto-seeded default. func newSyscallAccumulatorWithConfig(sampleCap int, rng *rand.Rand) *syscallAccumulator { if sampleCap <= 0 { sampleCap = syscallReservoirSampleCapDefault } if rng == nil { - rng = rand.New(rand.NewSource(time.Now().UnixNano())) + rng = rand.New(rand.NewPCG(rand.Uint64(), rand.Uint64())) } return &syscallAccumulator{ @@ -135,11 +138,11 @@ func buildSyscallSnapshots(inputs []syscallSnapshotInput, elapsed time.Duration) for _, in := range inputs { result = append(result, in.toSnapshot(rateDiv)) } - sort.Slice(result, func(i, j int) bool { - if result[i].Count != result[j].Count { - return result[i].Count > result[j].Count + slices.SortFunc(result, func(a, b SyscallSnapshot) int { + if a.Count != b.Count { + return cmp.Compare(b.Count, a.Count) } - return result[i].Name < result[j].Name + return cmp.Compare(a.Name, b.Name) }) return result } @@ -161,8 +164,8 @@ func (s *syscallStats) addSample(duration uint64, cap int, rng *rand.Rand) { return } - idx := rng.Int63n(int64(s.seenLatencies)) - if idx >= int64(cap) { + idx := rng.IntN(int(s.seenLatencies)) + if idx >= cap { return } s.samples[idx] = duration @@ -183,7 +186,7 @@ func (s *syscallStats) ensurePercentiles() { } sorted := append([]uint64(nil), s.samples...) - sort.Slice(sorted, func(i, j int) bool { return sorted[i] < sorted[j] }) + slices.Sort(sorted) s.cachedP50 = samplePercentile(sorted, 0.50) s.cachedP95 = samplePercentile(sorted, 0.95) s.cachedP99 = samplePercentile(sorted, 0.99) |
