// RTT管理器
type RTTManager struct {
rttData map[string][]int64
ewmaData map[string]int64
sampleWindow int
alpha float64
mu sync.RWMutex
}
func NewRTTManager() *RTTManager {
return &RTTManager{
rttData: make(map[string][]int64),
ewmaData: make(map[string]int64),
sampleWindow: 20,
alpha: 0.125,
}
}
func (r *RTTManager) UpdateRTT(deviceID string, rtt int64) {
r.mu.Lock()
defer r.mu.Unlock()
if _, exists := r.rttData[deviceID]; !exists {
r.rttData[deviceID] = make([]int64, 0, r.sampleWindow)
r.ewmaData[deviceID] = rtt
}
r.rttData[deviceID] = append(r.rttData[deviceID], rtt)
if len(r.rttData[deviceID]) > r.sampleWindow {
r.rttData[deviceID] = r.rttData[deviceID][1:]
}
// 计算EWMA
currentEWMA := r.ewmaData[deviceID]
newEWMA := int64(float64(currentEWMA)*(1-r.alpha) + float64(rtt)*r.alpha)
r.ewmaData[deviceID] = newEWMA
}
func (r *RTTManager) GetEWMARTT(deviceID string) int64 {
r.mu.RLock()
defer r.mu.RUnlock()
if ewma, exists := r.ewmaData[deviceID]; exists {
return ewma
}
return 0
}