У меня есть клиентская и серверная программа (оба в Obj-C), и я передаю файлы между двумя устройствами с помощью этих программ.
Передача работает нормально, но я хотел бы показать пользователю, какую скорость передачи они получают.
Итак, я знаю общий размер файла и какая часть файла была передана, есть ли способ определить скорость передачи по этой информации, а если нет, то какая информация мне нужна для расчета скорости передачи?
Спасибо





Как только вы начнете загрузку, запишите текущее системное время и сохраните его как «время начала». Затем все, что вам нужно сделать для расчета скорости передачи в любой момент во время передачи, - это снова взглянуть на системное время и использовать его как «текущее время» для расчета общего времени, затраченного на данный момент:
transfer_speed = bytes_transferred / ( current_time - start_time)
Вы, вероятно, захотите использовать секундную или миллисекундную точность со временем и, конечно, можете умножить результат на 8, если хотите бит / секунду.
Поскольку вы используете Какао, вы можете использовать класс NSDate для получения отметок времени. Например, при запуске передачи используйте следующее:
NSTimeInterval start = [NSDate timeIntervalSinceReferenceDate];
Затем периодически проверяйте скорость передачи, используя:
double speed = bytesTransferred / ([NSDate timeIntervalSinceReferenceDate] - start);
Poitner * не следует использовать с NSTimerInterval. Пожалуйста исправьте
Привет, Марк. Могу я узнать, как мы можем преобразовать эту скорость в Кбит / с или Мбит / с.
Эй, как я могу получить это значение в Мбит / с?
Следите за временем, которое занимает перевод. Скорость передачи - это просто количество переданных байтов / прошедших секунд, другими словами, байтов в секунду. Для этого вам не нужен общий размер. (Вы также можете показать% завершения, то есть переданные байты / общее количество байтов * 100)
Вам нужно будет знать
Байт, отправленных с самого начала (для расчета средней скорости передачи)
Байт, отправленных с последней секунды (для расчета текущей скорости передачи.)
This can be easily done if you know bytes sent from the beginning. (New bytes sent from the beginning - Bytes sent from the beginning 1 second ago)
(Bytes transfered / Total number of bytes)
Наивный способ - это bytes_downloaded / (now - start_time), но он становится неточным, если скорость соединения сильно колеблется или если пользователь начинает новую загрузку (возможно, в другом приложении) на полпути загрузки. И то, и другое может произойти, если пользователь запускает торрент в фоновом режиме.
Лучший способ (хотя и сложный в реализации) - сохранить массив периодических выборок и представить среднее значение.
Начните с массива, содержащего 0. Массив состоит из выборок, и каждая выборка - это количество байтов, загруженных с момента предыдущей выборки. Затем начните загрузку.
Каждые полсекунды (вы можете пробовать разные интервалы) измеряйте, сколько байтов вы загрузили, а затем вычтите предыдущую сумму из этой новой суммы. Добавьте разницу в качестве нового последнего элемента в массиве. Если это увеличивает массив сверх определенного размера, отрежьте первый элемент (самый старый образец). Затем представьте среднее значение по всем образцам.
Вы должны хранить образцы размером от 2 до 5 секунд, а интервал должен составлять от 0,5 до 1 секунды (это компромисс между валютой и производительностью).
Вы также можете удалить первый элемент из массива после его получения, если он равен нулю. Это делает ваш начальный репортаж более точным и помогает быстрее восстанавливаться после киосков, поскольку вы не включаете в среднее значение старые нули.
Отличный ответ, я всегда задавался вопросом, как лучше всего это сделать.
Эй, как я могу получить это значение в Мбит / с?
Как насчет использования формулы, предложенной в RFC? SRTT <- (1 - alpha) * SRTT + alpha * R', где SRTT - это сглаженный RTT, R` - это последний RTT, а рекомендованный alpha - это 1/8. Если вас беспокоят отклонения, для этого есть формула. (Хотя не уверен, стоит ли оно того ..)
Тем, кто сталкивается с этим вопросом, может оказаться полезным и этот: stackoverflow.com/q/2779600/115730