Простой фильтр нижних частот подходит только для того, чтобы убедиться, что неточности не создаются. Но если вы думаете немного глубже об измерении скорости передачи, вы получаете возможность поддерживать отдельные целые счетчики, чтобы сделать это правильно.
Если вы хотите, чтобы это было точное количество, обратите внимание на то, что имеется упрощение. Во-первых, когда речь идет о ставках, среднее арифметическое из них - это неправильная вещь для применения к байтам/сек (сек/байт более правильна - что приводит к гармоническому значению). Другая проблема заключается в том, что они должны быть взвешены. Из-за этого простое ведение счетчиков int64 байтов по сравнению с временем наблюдения фактически делает правильные вещи - как глупо, как кажется. Обычно вы взвешиваете на 1/n для каждого w. Посмотрите на аккуратные упрощения, что происходит, когда вы весите временем:
(w0 * b0/t0 + w1 * b1/t1 + w2 * b2/t2 + ...)/(w0 + w1 + w2 +. ..)
TotalBytes/
общую массу
(b0 + b1 + b2 + ...)/(w0 + w1 + w2 + ...)
Так просто держать отдельно (int64!) итоги байтов и миллисекунд. И только разделите их как шаг рендеринга, чтобы визуализировать скорость. Обратите внимание, что если вы вместо этого использовали среднее значение гармоник (которое вы должны делать для ставок - потому что вы действительно усредняете сек/байт), то это то же самое, что и время отправки байта, взвешенное по количеству байтов.
1/((w0 * t0/b0 + w1 * t1/b0 + ...)/(w0 + w1 + w2 + ...)) = TotalBytes/totalTime
Так среднее арифметическое, взвешенное по времени, совпадает с средним значением гармоник, взвешенным байтами. Просто сохраняйте общее количество байтов в одном var, а время в другом. Существует более глубокая причина того, что этот упрощенный список фактически правильный. Подумайте об интегралах. Предполагая отсутствие параллелизма, это буквально всего общее количество переданных байтов, деленное на общее время наблюдения. Предположим, что компьютер действительно занимает 1 шаг за миллисекунду и отправляет только целые байты - и вы наблюдаете весь временной интервал без пробелов. Нет приближений.
Обратите внимание, что если вы думаете об интеграле с (мсек, байт/мсек) в качестве единиц для (x, y), то область под кривой представляет собой байты, отправленные в течение периода наблюдения (точно). Вы получите тот же ответ, независимо от того, как были сделаны наблюдения. (т. е. сообщается 2x как часто).
Итак, просто сообщив (size_byte, start_ms, stop_ms), вы просто накапливаете (stop_ms-start_ms) во времени и накапливаете size_byte за наблюдение. Если вы хотите разбить эти ставки на график в минутных ведрах, тогда просто поддержите пару (байта, мс) в минуту (наблюдения).
Обратите внимание, что это тарифы для индивидуальных переводов. Индивидуальные переводы могут иметь 1 МБ/с (пользовательская точка зрения). Это тарифы, которые вы гарантируете конечным пользователям.
Вы можете оставить его здесь для простых случаев. Но делать это правильно, позволяет более интересные вещи.
С точки зрения сервера загружается. Предположим, что у двух пользователей было 1 МБ/с одновременно. Для этой статистики вам нужно вычесть время с двойным подсчетом. Если 2 пользователя выполняют 1 МБ/с одновременно в течение 1 с, то это 2 МБ/с за 1 секунду. Вам необходимо эффективно восстановить временные перекрытия и вычесть двойной счет времени.Явное регистрации в конце передачи (size_byte, start_ms, stop_ms) позволяет измерять интересные вещи:
- Количество размещенных переводов в любой момент времени (распределение длины очереди - то есть: «я буду работать из памяти? »)
- Пропускная способность в зависимости от количества передач (пропускная способность для длины очереди - то есть:« разрушается ли сайт, когда наше объявление отображается по телевизору? »)
- Использование - то есть: мы переплачиваем наш провайдер облачных вычислений? "
В этой ситуации все накопленные счетчики являются точной целочисленной арифметикой. Вычитание времени с двойным подсчетом внезапно приводит к сложным алгоритмам (когда они вычисляются эффективно и в режиме реального времени).
Возможно, вы ищете что-то вроде скользящего среднего, что означает, что вам нужно будет отслеживать данные временных рядов. –
Откуда вы получаете номера? – Pointy
@MattBall, поэтому вы говорите, что я должен сохранять полученные байты каждую секунду, а затем вычислять среднее значение за последние n секунд? Pointy: цифры из сценария загрузки недоступны, если вы запрашиваете дополнительные номера: вот и все, что у меня есть. –