Расчет скорости соединения/загрузки

У меня есть клиентская и серверная программа (как в Obj-C), так и передача файлов между двумя устройствами с помощью программ.

Передача работает нормально, но я хотел бы показать пользователю, какую скорость передачи они получают.

Итак, я знаю общий размер файла и размер переданного файла, есть ли способ определить скорость передачи из этой информации, а если нет, то какая информация мне нужна для расчета передачи скорость?

Спасибо

Ответ 1

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

transfer_speed = bytes_transferred / ( current_time - start_time)

Вероятно, вы хотите использовать вторую или миллисекундную точность со временем и, конечно, можете умножить результат на 8, если хотите бит/секунду.

Поскольку вы используете Cocoa, вы можете использовать класс NSDate для получения временных меток. Например, при запуске переноса используйте следующее:

NSTimeInterval start = [NSDate timeIntervalSinceReferenceDate];

Затем периодически проверяйте скорость передачи, используя:

double speed = bytesTransferred / ([NSDate timeIntervalSinceReferenceDate] - start);

Ответ 2

Наивный способ bytes_downloaded / (now - start_time), но это становится неточным, если скорость соединения колеблется дико, или если пользователь запускает другую загрузку (возможно, в другом приложении) на полпути через вашу загрузку. Оба они могут произойти, если пользователь запускает поток в фоновом режиме.

Лучшим способом (хотя сложнее реализовать) является сохранение массива периодических выборок и представление среднего значения.

Начните с массива, содержащего 0. Массив имеет образцы, и каждый образец представляет собой количество байтов, загруженных с предыдущего образца. Затем запустите загрузку.

Каждые полсекунды (вы можете попробовать разные интервалы), измерить, сколько байтов вы загрузили, а затем вычесть предыдущую итоговую сумму из этой новой суммы. Добавьте разницу в качестве нового последнего элемента в массиве. Если это увеличит массив за определенный размер, удалите первый элемент (самый старый образец). Затем укажите среднее значение всех образцов.

Вы должны хранить от 2 до 5 секунд образцы, а интервал должен быть где-то между 0,5 и 1 секундой (это компромисс между валютой и производительностью).

Вы также можете удалить первый элемент из массива после его получения, если он равен нулю. Это делает ваш исходный репортаж более точным и помогает вам быстрее восстанавливаться из киосков, так как вы не включаете старые нули в среднем.

Ответ 3

Вам нужно будет знать

  • Байт, отправленный с начала (для расчета средней скорости передачи)

  • Байты, отправленные с последней секунды (для расчета текущей скорости передачи.)

    Это можно легко сделать, если вы знаете байты, отправленные с самого начала. (Новые байты, отправленные с начала - Байты, отправленные с начала 1 секунда назад)

  • Общий размер файла (для расчета процента прогресса).

    (Байты переданы/Общее количество байтов)

Ответ 4

Следите за временем, которое занимает передача. Скорость передачи - это просто байты, переданные/секунда, иными словами, байты в секунду. Для этого вам не нужен общий размер. (Вы также можете показать% завершено, которое передано байтами/общее количество байтов * 100)