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

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

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

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

Спасибо


person kdbdallas    schedule 16.12.2008    source источник
comment
Для тех, кто сталкивается с этим вопросом, этот вопрос также может быть полезен: stackoverflow.com/q/2779600/115730   -  person Dave DeLong    schedule 20.10.2010


Ответы (4)


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

transfer_speed = bytes_transferred / ( current_time - start_time)

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

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

NSTimeInterval start = [NSDate timeIntervalSinceReferenceDate];

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

double speed = bytesTransferred / ([NSDate timeIntervalSinceReferenceDate] - start);
person Marc Novakowski    schedule 16.12.2008
comment
Poitner * не следует использовать с NSTimerInterval. Пожалуйста исправьте - person ashish; 06.01.2014
comment
Привет, Марк. Могу я узнать, как мы можем преобразовать эту скорость в Кбит / с или Мбит / с. - person Naresh; 08.08.2014
comment
Эй, как я могу получить это значение в Мбит / с? - person Asi Givati; 03.11.2016

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

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

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

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

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

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

person Peter Hosey    schedule 16.12.2008
comment
Отличный ответ, я всегда задавался вопросом, как лучше всего это сделать. - person Rob Keniger; 12.03.2010
comment
Эй, как я могу получить это значение в Мбит / с? - person Asi Givati; 03.11.2016
comment
Как насчет использования формулы, предложенной в RFC? SRTT <- (1 - alpha) * SRTT + alpha * R' где SRTT - сглаженный RTT, R` - это последний RTT, а рекомендованный alpha - 1/8. Если вас беспокоят отклонения, для этого есть формула. (Хотя не уверен, стоит ли оно того ..) - person funct7; 18.01.2017

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

  1. Байт, отправленных с самого начала (для расчета средней скорости передачи)

  2. # P3 #
    # P4 #
  3. Общий размер файла (для расчета процента прогресса.)
    # P5 #
person Chirantan    schedule 16.12.2008

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

person Piskvor left the building    schedule 16.12.2008