2011-01-03 9 views
11

En el siguiente código, estoy tratando de calcular la velocidad de descarga de una imagen, pero la velocidad aparece como infinito. ¿Qué estoy haciendo mal?Calcula la velocidad con javascript

var imageAddr = "/images/image.jpg" + "?n=" + Math.random(); 
var startTime, endTime; 
var downloadSize = 200000; 
var download = new Image(); 
download.onload = function() { 
    endTime = (new Date()).getTime(); 
    showResults(); 
} 
startTime = (new Date()).getTime(); 
download.src = imageAddr; 

function showResults() { 
    var duration = Math.round((endTime - startTime)/1000); 
    var bitsLoaded = downloadSize * 8; 
    var speedBps = Math.round(bitsLoaded/duration); 
    var speedKbps = (speedBps/1024).toFixed(2); 
    var speedMbps = (speedKbps/1024).toFixed(2); 
    alert("Your connection speed is: \n" + 
      speedBps + " bps\n" + 
      speedKbps + " kbps\n" + 
      speedMbps + " Mbps\n"); 
} 
+0

Esto es JavaScript puro, eliminó las etiquetas no relevantes. –

+1

También puede usar la api de la prueba de velocidad: http://speedof.me/api.html – advncd

+0

Para aquellos que han utilizado este código de JavaScript con éxito, ¿al principio no encontró ninguna llamada que vaya a "download.onload"? Esto es exactamente lo que estoy experimentando y todavía estoy tratando de descubrir por qué. –

Respuesta

7

duration es, probablemente, saliendo 0, y un número positivo dividido por cero produce el valor especial de infinito positivo en JavaScript.

+0

Eso es lo que adiviné, pero los valores finales speedBps, speedKbps, speedMbps son infinitos y no están divididos por la duración – Rajeev

+3

'speedBps' se calcula así:' var speedBps = Math.round (bitsLoaded/duration); '. Si 'duration' es 0, entonces' speedBps' será infinito. Y dado que las otras dos variables de velocidad se calculan a partir de 'speedBps', también serán infinitas. – cdhowie

6

Simplemente no redondee la duración.

var duration = (endTime - startTime)/1000; 
+0

Obtuve la velocidad de descarga como 13793103 bps, 13469.83 kbps13.15 Mbps. Esto es incorrecto ya que mi conexión a internet está limitada a 3Mbps. Esto debería ser 1.3 Mbps – Rajeev

+0

Primero, debes asegurarte de que la imagen no se envíe gzip, porque eso lo haría un poco más rápido (no mucho, pero inexacto). Luego, debe asegurarse de tener el número 'downloadSize' correcto. Finalmente, asegúrese de que el archivo de imagen no esté en 'localhost'. – Thai

+0

¿Qué es eso sobre el tamaño de descarga? – Rajeev

7

sólo pensar en ello: endTime y startTime están en [ms], por lo que su diferencia es también en ms.

Ejemplo con una carga de imágenes para 300 ms:

Math.round((endTime - startTime)/1000); 
-> Math.round(300/1000); 
-> Math.round(0.3); 
-> 0 

Dejar Math.round fuera del fragmento.

Y entonces, como los otros han dicho duration = 0 dará lugar a

speedBps = bitsLoaded/duration 
-> speedBps = bitsLoaded/0 
-> speedBps = Infinity 

Pero, tenga en cuenta que no se puede obtener resultados precisos como este. Hay latencia, tiempo de conexión, tiempo hasta el primer byte, etc. que cannot be measured según su ejemplo, y para una imagen < 1 MB, conducirán a resultados muy imprecisos.

+0

Cómo determinar el límite de carga/descarga de este – Rajeev

+1

He probado este método y varias técnicas similares con muy poca suerte para obtener resultados significativos de los números. En mis pruebas, los archivos pequeños, medianos y grandes dieron velocidades de descarga muy diferentes. Uno esperaría que las tasas similares, por lo que creo que las tasas no es una medida precisa sobre la que llegar a una conclusión sobre la velocidad ..... – alQemist

3

porque su duración es cercano a 0, entonces usted debe tratar

var = duración (endTime - fecha de inicio)/1000;

Cuestiones relacionadas