Browse Source

vendor: upgrade "github.com/beorn7/perks"

Signed-off-by: Gyuho Lee <gyuhox@gmail.com>
Gyuho Lee 7 years ago
parent
commit
b60259dce2
2 changed files with 31 additions and 6 deletions
  1. 2 1
      Gopkg.lock
  2. 29 5
      vendor/github.com/beorn7/perks/quantile/stream.go

+ 2 - 1
Gopkg.lock

@@ -2,9 +2,10 @@
 
 
 
 
 [[projects]]
 [[projects]]
+  branch = "master"
   name = "github.com/beorn7/perks"
   name = "github.com/beorn7/perks"
   packages = ["quantile"]
   packages = ["quantile"]
-  revision = "4c0e84591b9aa9e6dcfdf3e020114cd81f89d5f9"
+  revision = "3a771d992973f24aa725d07868b467d1ddfceafb"
 
 
 [[projects]]
 [[projects]]
   name = "github.com/bgentry/speakeasy"
   name = "github.com/bgentry/speakeasy"

+ 29 - 5
vendor/github.com/beorn7/perks/quantile/stream.go

@@ -77,15 +77,20 @@ func NewHighBiased(epsilon float64) *Stream {
 // is guaranteed to be within (Quantile±Epsilon).
 // is guaranteed to be within (Quantile±Epsilon).
 //
 //
 // See http://www.cs.rutgers.edu/~muthu/bquant.pdf for time, space, and error properties.
 // 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 {
 	ƒ := func(s *stream, r float64) float64 {
 		var m = math.MaxFloat64
 		var m = math.MaxFloat64
 		var f float64
 		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 {
 			} else {
-				f = (2 * epsilon * (s.n - r)) / (1 - quantile)
+				f = (2 * t.epsilon * (s.n - r)) / (1 - t.quantile)
 			}
 			}
 			if f < m {
 			if f < m {
 				m = f
 				m = f
@@ -96,6 +101,25 @@ func NewTargeted(targets map[float64]float64) *Stream {
 	return newStream(ƒ)
 	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
 // Stream computes quantiles for a stream of float64s. It is not thread-safe by
 // design. Take care when using across multiple goroutines.
 // design. Take care when using across multiple goroutines.
 type Stream struct {
 type Stream struct {