def update_averages(self): #damage "in" latency: (the time it takes for damage requests to be processed only) if len(self.damage_in_latency) > 0: data = [(when, latency) for when, _, _, latency in list(self.damage_in_latency)] self.avg_damage_in_latency, self.recent_damage_in_latency = calculate_time_weighted_average( data) #damage "out" latency: (the time it takes for damage requests to be processed and sent out) if len(self.damage_out_latency) > 0: data = [(when, latency) for when, _, _, latency in list(self.damage_out_latency)] self.avg_damage_out_latency, self.recent_damage_out_latency = calculate_time_weighted_average( data) #client decode speed: if len(self.client_decode_time) > 0: #the elapsed time recorded is in microseconds, so multiply by 1000*1000 to get the real value: self.avg_decode_speed, self.recent_decode_speed = calculate_timesize_weighted_average( list(self.client_decode_time), sizeunit=1000 * 1000) #network send speed: if len(self.damage_send_speed) > 0: self.avg_send_speed, self.recent_send_speed = calculate_timesize_weighted_average( list(self.damage_send_speed)) all_l = [ 0.1, self.avg_damage_in_latency, self.recent_damage_in_latency, self.avg_damage_out_latency, self.recent_damage_out_latency ] self.max_latency = max(all_l)
def update_averages(self): #damage "in" latency: (the time it takes for damage requests to be processed only) if len(self.damage_in_latency)>0: data = [(when, latency) for when, _, _, latency in list(self.damage_in_latency)] self.avg_damage_in_latency, self.recent_damage_in_latency = calculate_time_weighted_average(data) #damage "out" latency: (the time it takes for damage requests to be processed and sent out) if len(self.damage_out_latency)>0: data = [(when, latency) for when, _, _, latency in list(self.damage_out_latency)] self.avg_damage_out_latency, self.recent_damage_out_latency = calculate_time_weighted_average(data) #client decode speed: if len(self.client_decode_time)>0: #the elapsed time recorded is in microseconds, so multiply by 1000*1000 to get the real value: self.avg_decode_speed, self.recent_decode_speed = calculate_timesize_weighted_average(list(self.client_decode_time), sizeunit=1000*1000) #network send speed: if len(self.damage_send_speed)>0: self.avg_send_speed, self.recent_send_speed = calculate_timesize_weighted_average(list(self.damage_send_speed)) all_l = [0.1, self.avg_damage_in_latency, self.recent_damage_in_latency, self.avg_damage_out_latency, self.recent_damage_out_latency] self.max_latency = max(all_l)
def get_target_client_latency(self, min_client_latency, avg_client_latency, abs_min=0.010): """ geometric mean of the minimum (+20%) and average latency but not higher than twice more than the minimum, and not lower than abs_min. Then we add the average decoding latency. """ decoding_latency = 0.010 if len(self.client_decode_time)>0: decoding_latency, _ = calculate_timesize_weighted_average(list(self.client_decode_time)) decoding_latency /= 1000.0 min_latency = max(abs_min, min_client_latency or abs_min)*1.2 avg_latency = max(min_latency, avg_client_latency or abs_min) max_latency = 2.0*min_latency return max(abs_min, min(max_latency, sqrt(min_latency*avg_latency))) + decoding_latency
def test_calculate_timesize_weighted_average(): #event_time, size, elapsed_time now = time.time() sample_size = 100000 data = [] t = now - sample_size for _ in xrange(sample_size): s = random.randint(1000, 10000) v = random.random() data.append((t, s, v)) t += 1 start = time.time() v = calculate_timesize_weighted_average(data) end = time.time() print("test_calculate_timesize_weighted_average(%s records)=%s" % (len(data), v)) print("elapsed time: %.1fms" % (1000*(end-start)))
def test_calculate_timesize_weighted_average(): #event_time, size, elapsed_time now = time.time() sample_size = 100000 data = [] t = now - sample_size for _ in xrange(sample_size): s = random.randint(1000, 10000) v = random.random() data.append((t, s, v)) t += 1 start = time.time() v = calculate_timesize_weighted_average(data) end = time.time() print("test_calculate_timesize_weighted_average(%s records)=%s" % (len(data), v)) print("elapsed time: %.1fms" % (1000 * (end - start)))