2011-01-03 17 views
11

W poniższym kodzie próbuję obliczyć prędkość pobierania obrazu, ale prędkość wychodzi jako nieskończoność. Co ja robię źle?Oblicz prędkość za pomocą 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

To jest czysty JavaScript, usunięto nieistotne znaczniki. –

+1

Możesz także skorzystać z testu prędkości api: http://speedof.me/api.html – advncd

+0

Dla tych, którzy z powodzeniem używali tego kodu Javascript, czy początkowo nie napotkasz żadnych połączeń na "download.onload"? Właśnie tego doświadczam i wciąż próbuję dowiedzieć się, dlaczego. –

Odpowiedz

7

duration jest prawdopodobnie wychodzi 0, a dodatnia liczba podzielona przez zero daje szczególną wartość dodatnią nieskończoność w JavaScript.

+0

To, co się domyślałem, ale ostateczne wartości speedBps, speedKbps, speedMbps all są nieskończoności i nie są one dzielone przez czas trwania – Rajeev

+3

'speedBps' jest obliczane w następujący sposób:' var speedBps = Math.round (bitsLoaded/duration); '. Jeśli "duration" wynosi 0, to 'speedBps' będzie nieskończonością. A ponieważ pozostałe dwie zmienne prędkości są obliczane z 'speedBps', będą również nieskończoności. – cdhowie

6

Po prostu nie zaokrąglaj czasu trwania.

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

Mam prędkość pobierania jako 13793103 bps, 13469,83 kbps13.15 Mb/s. Jest to niepoprawne, ponieważ moje połączenie internetowe jest ograniczone do 3 Mb/s. Powinno to być 1,3 Mb/s. – Rajeev

+0

Najpierw należy się upewnić, że obraz nie jest wysyłany gzip, ponieważ to sprawiłoby, że byłaby nieco szybsza (niewiele, ale niedokładna). Następnie upewnij się, że masz odpowiedni numer 'downloadSize'. Na koniec upewnij się, że plik obrazu nie znajduje się na 'localhost'. – Thai

+0

Co to jest w rozmiarze pobierania? – Rajeev

7

Pomyślcie o tym: endTime i startTime są w [ms], więc ich różnica jest również w ms.

Przykład z załadunkiem obrazu dla 300 ms:

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

Pozostaw Math.round z fragmencie.

A potem jak inni stwierdził duration = 0 doprowadzi do

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

Ale, należy pamiętać, że nie można uzyskać dokładne wyniki jak ten. Występuje opóźnienie, czas połączenia, czas do pierwszego bajtu itd., Który według twojego przykładu i cannot be measured doprowadzi do bardzo niedokładnych wyników.

+0

Jak określić limit pobierania/pobierania z tego – Rajeev

+1

Przetestowałem tę metodę i kilka podobnych technik z niewielkim szczęściem w uzyskaniu znaczących wyników z liczb. W moich testach małe i średnie pliki były bardzo różne. Można by się spodziewać podobnych wskaźników - więc uważam, że stawki nie są dokładnym pomiarem, na podstawie którego można wyciągnąć wnioski dotyczące prędkości ..... – alQemist

3

ponieważ czas jest bliski 0, należy spróbować

var duration = (EndTime - startTime)/1000;

Powiązane problemy