velocidad tiempo test tengo speedy movil megas medir internet gratis descarga cuantos claro calcular objective-c cocoa

objective c - tiempo - Cálculo de velocidad de conexión/descarga



test de velocidad speedy (4)

Necesitarás saber

  1. Bytes enviados desde el principio (para calcular la tasa promedio de transferencia)

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

    Esto se puede hacer fácilmente si conoce los bytes enviados desde el principio. (Nuevos bytes enviados desde el principio - Bytes enviados desde el principio 1 segundo atrás)

  3. Tamaño total del archivo (para calcular el porcentaje de progreso)

    (Bytes transferidos / Número total de bytes)

Tengo un programa de cliente y servidor (ambos en Obj-C) y estoy transfiriendo archivos entre dos dispositivos usando los programas.

La transferencia está funcionando bien, pero me gustaría mostrarle al usuario qué tasa de transferencia están obteniendo.

Así que sé el tamaño total del archivo, y la cantidad de archivo que se ha transferido, ¿hay alguna forma de calcular la velocidad de transferencia de esta información y, de no ser así, qué información necesito para calcular la velocidad de transferencia?

Gracias


Mantenga un registro del tiempo que está tomando la transferencia. 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% completado, que es bytes transferidos / bytes totales * 100)


La forma ingenua es bytes_downloaded / (now - start_time) , pero eso se vuelve impreciso si la velocidad de conexión fluctúa enormemente, o si el usuario inicia otra descarga (quizás en otra aplicación) a mitad de la 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 mantener 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).

También es posible que 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.


Tan pronto como inicie la descarga, capture la hora actual del sistema y almacénela como la "hora de inicio". Entonces, todo lo que necesita hacer para calcular la velocidad de transferencia en cualquier punto durante la transferencia es observar nuevamente la hora del sistema y usarla como la "hora actual" para calcular el tiempo total empleado hasta el momento:

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.

Como está usando Cocoa, podría usar la clase NSDate para obtener las marcas de tiempo. Por ejemplo, use lo siguiente cuando inicie la transferencia:

NSTimeInterval start = [NSDate timeIntervalSinceReferenceDate];

Luego, compruebe periódicamente la velocidad de transferencia utilizando:

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