Расчет скорости соединения/загрузки
У меня есть клиентская и серверная программа (как в 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)