2008-12-16 19 views
10

Tengo un programa de cliente y servidor (ambos en Obj-C) y estoy transfiriendo archivos entre dos dispositivos usando los programas.Calculando velocidad de conexión/descarga

La transferencia funciona bien, pero me gustaría mostrar al usuario la velocidad de transferencia que están obteniendo.

Así que sé el tamaño total del archivo, y la cantidad de archivo que se ha transferido, hay una manera de averiguar la velocidad de transferencia de esta información, y si no, ¿qué información necesito para calcular el ¿ratio de transferencia?

Gracias

+1

Para quienes se encuentren con esta pregunta, ésta también puede ser útil: http://stackoverflow.com/q/2779600/115730 –

Respuesta

20

Tan pronto como comience la descarga, capturan la hora actual del sistema y lo almacenan como la "hora de inicio". Entonces, todo lo que necesita hacer para calcular la velocidad de transferencia en cualquier momento durante la transferencia es mirar a la hora del sistema nuevo y utilizarlo como la "hora actual" para calcular el tiempo total gastado hasta ahora:

transfer_speed = bytes_transferred/(current_time - start_time) 

Probablemente desee utilizar una precisión de segundo o milisegundo con los tiempos, y por supuesto puede multiplicar el resultado por 8 si desea bits/segundo.

Dado que está utilizando Cocoa, podría utilizar la clase NSDate para obtener las marcas de tiempo. Por ejemplo, utilice el siguiente cuando se inicia la transferencia:

NSTimeInterval start = [NSDate timeIntervalSinceReferenceDate]; 

A continuación, compruebe periódicamente la velocidad de transferencia mediante el uso de:

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

Poitner * no debe usarse con NSTimerInterval. Por favor, corrige – ashish

+0

Hola Marc. ¿Puedo saber cómo podemos convertir esa velocidad en Kbps o mbps? – Naresh

+0

Oye, ¿cómo puedo obtener este valor en Mbps? –

0

llevar la cuenta del tiempo que la transferencia está tomando. La velocidad de transferencia es simplemente bytes transferidos/segundos transcurridos, en otras palabras, bytes por segundo. No necesitas el tamaño total para esto. (También puede mostrar%, la cual estará bytes transferidos/bytes en total * 100)

1

Usted necesitará saber

  1. bytes enviados desde el principio (Para el cálculo de la tasa media de transferencia)

  2. bytes enviados desde el último segundo (para calcular la velocidad de transferencia de corriente.)

    Esto se puede hacer fácilmente si usted sabe bytes enviados desde el principio. (New bytes enviados desde el principio - bytes enviados desde el principio hace 1 hora)

  3. Tamaño total del archivo (Para calcular el porcentaje de avance.)

    (Bytes transfirieron/Número total de bytes)

40

la forma ingenua es bytes_downloaded/(now - start_time), pero que se convierte en inexacta si la velocidad de conexión fluctúa violentamente, o si el usuario inicia otra descarga (tal vez en otra aplicación) la mitad de su descarga. Ambas cosas pueden suceder si el usuario ejecuta un torrente en segundo plano.

Una mejor manera (aunque más difícil de implementar) es mantener una serie de muestras periódicas y presentar el promedio.

Comience con una matriz que contenga 0. La matriz es de muestras, y cada muestra es la cantidad de bytes descargados desde la muestra anterior. Luego comienza la descarga.

Cada medio segundo (puede probar diferentes intervalos), mida cuántos bytes ha descargado, luego resta el total anterior de este nuevo total. Agregue la diferencia como el último elemento nuevo en la matriz. Si esto hace crecer la matriz más allá de un cierto tamaño, corte el primer elemento (muestra más antigua). Luego, presente el promedio de todas las muestras.

Debe guardar entre 2 y 5 segundos de muestras, y el intervalo debe ser de entre 0,5 y 1 segundos (es una compensación entre la moneda y el rendimiento).

Es posible que también desee eliminar el primer elemento de la matriz después de recuperarlo si es cero. Esto hace que su reportaje inicial sea más preciso y le ayuda a recuperarse más rápidamente de los puestos, ya que no incluye los ceros viejos en el promedio.

+1

Una gran respuesta, siempre me he preguntado cuál sería la mejor manera de hacerlo. –

+0

Oye, ¿cómo puedo obtener este valor en Mbps? –

+0

¿Qué le parece usar la fórmula sugerida en las RFC? 'SRTT <- (1 - alpha) * SRTT + alpha * R'' donde' SRTT' está suavizado RTT, 'R \' 'es el último RTT, y' alpha 'recomendado es '1/8'. Si te preocupa la desviación, también hay una fórmula para eso. (Aunque no estoy seguro de si vale la pena ...) – BridgeTheGap

Cuestiones relacionadas