sample_test.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. package metrics
  2. import (
  3. "runtime"
  4. "testing"
  5. "time"
  6. )
  7. func BenchmarkExpDecaySample257(b *testing.B) {
  8. benchmarkSample(b, NewExpDecaySample(257, 0.015))
  9. }
  10. func BenchmarkExpDecaySample514(b *testing.B) {
  11. benchmarkSample(b, NewExpDecaySample(514, 0.015))
  12. }
  13. func BenchmarkExpDecaySample1028(b *testing.B) {
  14. benchmarkSample(b, NewExpDecaySample(1028, 0.015))
  15. }
  16. func BenchmarkUniformSample257(b *testing.B) {
  17. benchmarkSample(b, NewUniformSample(257))
  18. }
  19. func BenchmarkUniformSample514(b *testing.B) {
  20. benchmarkSample(b, NewUniformSample(514))
  21. }
  22. func BenchmarkUniformSample1028(b *testing.B) {
  23. benchmarkSample(b, NewUniformSample(1028))
  24. }
  25. func TestExpDecaySample10(t *testing.T) {
  26. s := NewExpDecaySample(100, 0.99)
  27. for i := 0; i < 10; i++ {
  28. s.Update(int64(i))
  29. }
  30. if size := s.Size(); 10 != size {
  31. t.Errorf("s.Size(): 10 != %v\n", size)
  32. }
  33. if l := len(s.Values()); 10 != l {
  34. t.Errorf("len(s.Values()): 10 != %v\n", l)
  35. }
  36. for _, v := range s.Values() {
  37. if v > 10 || v < 0 {
  38. t.Errorf("out of range [0, 10): %v\n", v)
  39. }
  40. }
  41. }
  42. func TestExpDecaySample100(t *testing.T) {
  43. s := NewExpDecaySample(1000, 0.01)
  44. for i := 0; i < 100; i++ {
  45. s.Update(int64(i))
  46. }
  47. if size := s.Size(); 100 != size {
  48. t.Errorf("s.Size(): 100 != %v\n", size)
  49. }
  50. if l := len(s.Values()); 100 != l {
  51. t.Errorf("len(s.Values()): 100 != %v\n", l)
  52. }
  53. for _, v := range s.Values() {
  54. if v > 100 || v < 0 {
  55. t.Errorf("out of range [0, 100): %v\n", v)
  56. }
  57. }
  58. }
  59. func TestExpDecaySample1000(t *testing.T) {
  60. s := NewExpDecaySample(100, 0.99)
  61. for i := 0; i < 1000; i++ {
  62. s.Update(int64(i))
  63. }
  64. if size := s.Size(); 100 != size {
  65. t.Errorf("s.Size(): 100 != %v\n", size)
  66. }
  67. if l := len(s.Values()); 100 != l {
  68. t.Errorf("len(s.Values()): 100 != %v\n", l)
  69. }
  70. for _, v := range s.Values() {
  71. if v > 1000 || v < 0 {
  72. t.Errorf("out of range [0, 1000): %v\n", v)
  73. }
  74. }
  75. }
  76. // This test makes sure that the sample's priority is not amplified by using
  77. // nanosecond duration since start rather than second duration since start.
  78. // The priority becomes +Inf quickly after starting if this is done,
  79. // effectively freezing the set of samples until a rescale step happens.
  80. func TestExpDecaySampleNanosecondRegression(t *testing.T) {
  81. s := NewExpDecaySample(100, 0.99)
  82. for i := 0; i < 100; i++ {
  83. s.Update(10)
  84. }
  85. time.Sleep(1 * time.Millisecond)
  86. for i := 0; i < 100; i++ {
  87. s.Update(20)
  88. }
  89. v := s.Values()
  90. avg := float64(0)
  91. for i := 0; i < len(v); i++ {
  92. avg += float64(v[i])
  93. }
  94. avg /= float64(len(v))
  95. if avg > 16 || avg < 14 {
  96. t.Errorf("out of range [14, 16]: %v\n", avg)
  97. }
  98. }
  99. func TestUniformSample(t *testing.T) {
  100. s := NewUniformSample(100)
  101. for i := 0; i < 1000; i++ {
  102. s.Update(int64(i))
  103. }
  104. if size := s.Size(); 100 != size {
  105. t.Errorf("s.Size(): 100 != %v\n", size)
  106. }
  107. if l := len(s.Values()); 100 != l {
  108. t.Errorf("len(s.Values()): 100 != %v\n", l)
  109. }
  110. for _, v := range s.Values() {
  111. if v > 1000 || v < 0 {
  112. t.Errorf("out of range [0, 100): %v\n", v)
  113. }
  114. }
  115. }
  116. func TestUniformSampleIncludesTail(t *testing.T) {
  117. s := NewUniformSample(100)
  118. max := 100
  119. for i := 0; i < max; i++ {
  120. s.Update(int64(i))
  121. }
  122. v := s.Values()
  123. sum := 0
  124. exp := (max - 1) * max / 2
  125. for i := 0; i < len(v); i++ {
  126. sum += int(v[i])
  127. }
  128. if exp != sum {
  129. t.Errorf("sum: %v != %v\n", exp, sum)
  130. }
  131. }
  132. func benchmarkSample(b *testing.B, s Sample) {
  133. b.StopTimer()
  134. var memStats runtime.MemStats
  135. var pauseTotalNs uint64
  136. runtime.ReadMemStats(&memStats)
  137. pauseTotalNs = memStats.PauseTotalNs
  138. b.StartTimer()
  139. for i := 0; i < b.N; i++ {
  140. s.Update(1)
  141. }
  142. b.StopTimer()
  143. runtime.GC()
  144. runtime.ReadMemStats(&memStats)
  145. b.Logf("GC cost: %d ns/op", int(memStats.PauseTotalNs-pauseTotalNs)/b.N)
  146. }