Вопрос по c#, download, download-manager, downloading – Расчет текущей (не средней) скорости загрузки

5

В моем приложении для управления загрузкой я использую приведенный ниже код для расчета текущей скорости передачи:

<code>        TimeSpan interval = DateTime.Now - lastUpdateTime;

        downloadSpeed = (int)Math.Floor((double)(DownloadedSize + cachedSize - lastUpdateDownloadedSize) / interval.TotalSeconds);

        lastUpdateDownloadedSize = DownloadedSize + cachedSize;
        lastUpdateTime = DateTime.Now;
</code>

В основном это работает так, как я хочу (я обновляю скорость каждые 4 секунды или около того), но всегда есть некоторые сумасшедшие всплески в скорости загрузки, когда она колеблется. Моя средняя скорость загрузки составляет около 600 кБ / с, а иногда она показывает 10,25 МБ / с или даже отрицательные значения, такие как -2093848 б / с. Как это могло произойти?

Каков наилучший способ рассчитать скорость загрузки в режиме реального времени? Меня не интересует средняя скорость (DownloadedSize / TimeElapsed.TotalSeconds), потому что она не дает реалистичных результатов.

@spender - Нет, это не отменяется таким образом. Джим Мишель - DownloadedSize увеличивается с CachedSize, когда кэш загрузки записывается в локальный файл. Максимальный размер кэша составляет 1 МБ. Я думаю, что нет проблем в этой области. И спасибо за предложение, я рассмотрю возможность использования секундомера вместо интервалов, основанных на системном времени, хотя расчет скорости каждую секунду, а не каждые несколько миллисекунд, кажется, лекарством от этих пиков. marko
Ваши расчеты не отменяютсяDownloadedSize/interval.TotalSeconds? spender
Вы должны использовать DateTime.UtcNow вместо DateTime.Now, он не меняется дважды в год. spender
Поиск мгновенной скорости изменения в книге исчисления или в Интернете. P.Brian.Mackey
Вы не показываете нам достаточно кода, чтобы сказать, почему вы можете получить отрицательное число. КакDownloadSize рассчитывается? ЯвляетсяcachedSize обнуляется после использования здесь? Как упомянул @spender, вы должны изменить способ расчета истекшего времени, хотяDateTime.UtcNow не намного лучший выбор, чемDateTime.Now, Увидетьblog.mischel.com/2012/05/08/… по причине почему. Jim Mischel

Ваш Ответ

1   ответ
4

что «в режиме реального времени» недостижимо, вы должны попытаться смоделировать его, сделав интервал настолько малым и точным, насколько это возможно, и рассчитав среднее значение за интервал, проверив правильность кода. Например:

DateTime now = DateTime.Now;
TimeSpan interval = now - lastUpdateTime;
timeDiff = interval.TotalSeconds;
sizeDiff = DownloadedSize + cachedSize - lastUpdateDownloadedSize;
speed = (int)Math.Floor((double)(sizeDiff) / timeDiff);
lastUpdateDownloadedSize = DownloadedSize + cachedSize;
lastUpdateTime = now;

Одно отличие с вашим кодом:

Only calculate Now once, use it twice.
Вы совершенно правы ... Я соответственно отредактирую ответ
Спасибо saverio, я думаю, что была некоторая проблема с временным интервалом, потому что этот расчет скорости производился каждые несколько миллисекунд. Теперь я вычисляю это каждую секунду или около того, и нет огромных скачков в ставке. marko
Я не согласен с вашими соображениями об использовании TotalMilliseconds за TotalSeconds. Оба представлены числами с плавающей запятой двойной точности. Не будет никакой потери точности, если вы предпочтете одно другому, вы просто добавите больше вычислений.

Похожие вопросы