From 77a3780c25735901928284496efc4b6349de328c Mon Sep 17 00:00:00 2001 From: Sebastiaan van Stijn Date: Mon, 13 Jan 2020 15:05:45 +0100 Subject: [PATCH] vendor: bump beorn7/perks v1.0.1 full diff: https://github.com/beorn7/perks/compare/4c0e84591b9aa9e6dcfdf3e020114cd81f89d5f9...v1.0.1 - beorn7/perks#3 Avoid iterating on maps - Speed up InsertTargeted* functions by at least 2x by avoiding iterating on maps. - beorn7/perks#4 Fixed format error - Use 1000000 instead of 1e6 for int constant - Add go module support Signed-off-by: Sebastiaan van Stijn --- vendor.conf | 2 +- vendor/github.com/beorn7/perks/go.mod | 3 ++ .../beorn7/perks/quantile/stream.go | 34 ++++++++++++++++--- 3 files changed, 33 insertions(+), 6 deletions(-) create mode 100644 vendor/github.com/beorn7/perks/go.mod diff --git a/vendor.conf b/vendor.conf index ecedabd8f..65759ba2d 100644 --- a/vendor.conf +++ b/vendor.conf @@ -1,4 +1,4 @@ -github.com/beorn7/perks 4c0e84591b9aa9e6dcfdf3e020114cd81f89d5f9 +github.com/beorn7/perks 37c8de3658fcb183f997c4e13e8337516ab753e6 # v1.0.1 github.com/BurntSushi/toml 3012a1dbe2e4bd1391d42b32f0577cb7bbc7f005 # v0.3.1 github.com/containerd/btrfs af5082808c833de0e79c1e72eea9fea239364877 github.com/containerd/cgroups 7347743e5d1e8500d9f27c8e748e689ed991d92b diff --git a/vendor/github.com/beorn7/perks/go.mod b/vendor/github.com/beorn7/perks/go.mod new file mode 100644 index 000000000..c4022f212 --- /dev/null +++ b/vendor/github.com/beorn7/perks/go.mod @@ -0,0 +1,3 @@ +module github.com/beorn7/perks + +go 1.11 diff --git a/vendor/github.com/beorn7/perks/quantile/stream.go b/vendor/github.com/beorn7/perks/quantile/stream.go index f4cabd669..d7d14f8eb 100644 --- a/vendor/github.com/beorn7/perks/quantile/stream.go +++ b/vendor/github.com/beorn7/perks/quantile/stream.go @@ -77,15 +77,20 @@ func NewHighBiased(epsilon float64) *Stream { // is guaranteed to be within (Quantile±Epsilon). // // See http://www.cs.rutgers.edu/~muthu/bquant.pdf for time, space, and error properties. -func NewTargeted(targets map[float64]float64) *Stream { +func NewTargeted(targetMap map[float64]float64) *Stream { + // Convert map to slice to avoid slow iterations on a map. + // ƒ is called on the hot path, so converting the map to a slice + // beforehand results in significant CPU savings. + targets := targetMapToSlice(targetMap) + ƒ := func(s *stream, r float64) float64 { var m = math.MaxFloat64 var f float64 - for quantile, epsilon := range targets { - if quantile*s.n <= r { - f = (2 * epsilon * r) / quantile + for _, t := range targets { + if t.quantile*s.n <= r { + f = (2 * t.epsilon * r) / t.quantile } else { - f = (2 * epsilon * (s.n - r)) / (1 - quantile) + f = (2 * t.epsilon * (s.n - r)) / (1 - t.quantile) } if f < m { m = f @@ -96,6 +101,25 @@ func NewTargeted(targets map[float64]float64) *Stream { return newStream(ƒ) } +type target struct { + quantile float64 + epsilon float64 +} + +func targetMapToSlice(targetMap map[float64]float64) []target { + targets := make([]target, 0, len(targetMap)) + + for quantile, epsilon := range targetMap { + t := target{ + quantile: quantile, + epsilon: epsilon, + } + targets = append(targets, t) + } + + return targets +} + // Stream computes quantiles for a stream of float64s. It is not thread-safe by // design. Take care when using across multiple goroutines. type Stream struct {