LINUX.ORG.RU

Алгоритм рассчета средней величины (+)


0

0

Есть что-то типа даунлодера
который дает данные типа
получено столько то байт
нужно реализовать алгоритм
который бы показывал среднюю скорость
за последние N секунд, на ум приходит
только сохранять данные за этот промежуток
и когда приходит следующее значение
убирать самое старое а остальное
считать уже..... но это тупо т.к. промежуток
может быть довольно большой, временные интервалы
между получениями значений тоже плавают
думаю есть какой-то очевидный и более простой
и точный способ которого я просто не вижу
может быть кто-то его подскажет ?
:)


anonymous

Среднее время - количество закаченного отнесенное к времени закачки. Т.е. посчитал сколько закачено за 10 минут и разделил на 10. Получил байт/мин. Все.

olegk ★★
()
Ответ на: комментарий от olegk

Как считать среднее значение я вполне себе представляю
спасибо за напоминание,
проблема в другом как посчитать сколько закачано за
10 минут в динамике чтоб ЗА ПОСЛЕДНИЕ 10 минут скорость
постоянно показывалась, с приличной точностью....

anonymous
()
Ответ на: комментарий от anonymous

1. Помнить время старта
2. Помнить сколько данных закачано.
Делать следующее:

a. Пришли данные от даунлоадера - сделалось += к кол-ву данных.
b. Сработал евент ежесекундный который анализирует кол-во данных и прошедшее время со старта.

Единственный минус - если даунлоадер шлёт через очень долгие прмежутки типа секунду 20-30 и более то значение скорости будет постоянно скакать. А так вполне адекватно будет казать, если он шлёт каждые 1-5 секунд не более, а евент срабатывает ежесекундно.

ms
()

я понял что ты спрашиваешь. Ты не хочешь хранить историю, сколько было скачано за последнюю секунду, за последнюю-1 ... последнюю-N. Имхо придется хранить.

dilmah ★★★★★
()
Ответ на: комментарий от ms

ему нужно не среднее со старта. А среднее за последние 10 минут, скажем. Обновлять нужно раз в секунду, например.

dilmah ★★★★★
()

Напиши формулы на бумажке. Все станет ясно.

Сохраняешь последнее вычисленное значение и самое старое (N секунд назад, say, S{i}). Когда приходит новое(S{i+N+1}), из последнего вычисленного и самого старого восстанавливается (S{i+1}+...+S{i+N})/N, а потом добавляешь S{i+N+1}/N

Die-Hard ★★★★★
()
Ответ на: комментарий от Die-Hard

> Сохраняешь последнее вычисленное значение и самое старое (N секунд назад, say, S{i}).

А откуда он возьмет самое последнее в следующий раз? Историю за последние N секунд все равно нужно хранить.

dilmah ★★★★★
()

>какой-то очевидный и более простой и точный способ которого я просто не вижу

А что за задача? Высокоточные измерения?

Может быть приблизить самое старое средним?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.