github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/metrics/ewma.go (about) 1 2 //此源码被清华学神尹成大魔王专业翻译分析并修改 3 //尹成QQ77025077 4 //尹成微信18510341407 5 //尹成所在QQ群721929980 6 //尹成邮箱 yinc13@mails.tsinghua.edu.cn 7 //尹成毕业于清华大学,微软区块链领域全球最有价值专家 8 //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620 9 package metrics 10 11 import ( 12 "math" 13 "sync" 14 "sync/atomic" 15 ) 16 17 //EWMA连续计算指数加权移动平均值 18 //基于外部时钟信号源。 19 type EWMA interface { 20 Rate() float64 21 Snapshot() EWMA 22 Tick() 23 Update(int64) 24 } 25 26 //new ewma用给定的alpha构造一个新的ewma。 27 func NewEWMA(alpha float64) EWMA { 28 if !Enabled { 29 return NilEWMA{} 30 } 31 return &StandardEWMA{alpha: alpha} 32 } 33 34 //newewma1构建一个新的ewma,移动平均值为一分钟。 35 func NewEWMA1() EWMA { 36 return NewEWMA(1 - math.Exp(-5.0/60.0/1)) 37 } 38 39 //newewma5构建一个新的ewma,平均移动5分钟。 40 func NewEWMA5() EWMA { 41 return NewEWMA(1 - math.Exp(-5.0/60.0/5)) 42 } 43 44 //newewma15构建一个新的ewma,平均移动15分钟。 45 func NewEWMA15() EWMA { 46 return NewEWMA(1 - math.Exp(-5.0/60.0/15)) 47 } 48 49 //ewmasnapshot是另一个ewma的只读副本。 50 type EWMASnapshot float64 51 52 //Rate返回快照时每秒事件的速率 53 //拿。 54 func (a EWMASnapshot) Rate() float64 { return float64(a) } 55 56 //快照返回快照。 57 func (a EWMASnapshot) Snapshot() EWMA { return a } 58 59 //蜱恐慌。 60 func (EWMASnapshot) Tick() { 61 panic("Tick called on an EWMASnapshot") 62 } 63 64 //更新恐慌。 65 func (EWMASnapshot) Update(int64) { 66 panic("Update called on an EWMASnapshot") 67 } 68 69 //尼罗河流域是一个绝无仅有的EWMA。 70 type NilEWMA struct{} 71 72 //价格是不允许的。 73 func (NilEWMA) Rate() float64 { return 0.0 } 74 75 //快照是不可操作的。 76 func (NilEWMA) Snapshot() EWMA { return NilEWMA{} } 77 78 //滴答声是禁止的。 79 func (NilEWMA) Tick() {} 80 81 //更新是不可操作的。 82 func (NilEWMA) Update(n int64) {} 83 84 //StandardEWMA是EWMA的标准实现并跟踪 85 //对未计数的事件进行处理。它使用 86 //同步/原子包以管理未计数的事件。 87 type StandardEWMA struct { 88 uncounted int64 //!\这应该是确保64位对齐的第一个成员 89 alpha float64 90 rate float64 91 init bool 92 mutex sync.Mutex 93 } 94 95 //Rate返回每秒事件的移动平均速率。 96 func (a *StandardEWMA) Rate() float64 { 97 a.mutex.Lock() 98 defer a.mutex.Unlock() 99 return a.rate * float64(1e9) 100 } 101 102 //快照返回EWMA的只读副本。 103 func (a *StandardEWMA) Snapshot() EWMA { 104 return EWMASnapshot(a.Rate()) 105 } 106 107 //勾选时钟以更新移动平均值。它假定它被调用 108 //每五秒钟。 109 func (a *StandardEWMA) Tick() { 110 count := atomic.LoadInt64(&a.uncounted) 111 atomic.AddInt64(&a.uncounted, -count) 112 instantRate := float64(count) / float64(5e9) 113 a.mutex.Lock() 114 defer a.mutex.Unlock() 115 if a.init { 116 a.rate += a.alpha * (instantRate - a.rate) 117 } else { 118 a.init = true 119 a.rate = instantRate 120 } 121 } 122 123 //更新添加了n个未计数的事件。 124 func (a *StandardEWMA) Update(n int64) { 125 atomic.AddInt64(&a.uncounted, n) 126 }