使用javascript计算速度

Raj*_*eev 14 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" );
}
Run Code Online (Sandbox Code Playgroud)

gbl*_*zex 8

试想一下:endTime并且startTime它们在[ms],所以它们的区别也在于ms.

图像加载300毫秒的示例:

Math.round((endTime - startTime) / 1000);
-> Math.round(300 / 1000);
-> Math.round(0.3);
-> 0
Run Code Online (Sandbox Code Playgroud)

离开Math.round片段.

然后,如规定的其他duration = 0会导致

speedBps = bitsLoaded / duration
-> speedBps = bitsLoaded / 0
-> speedBps = Infinity
Run Code Online (Sandbox Code Playgroud)

请注意,您无法获得这样的准确结果.存在延迟,连接时间,第一个字节的时间等,您的示例无法测量,对于< 1 MB的图像,它们将导致非常不准确的结果.


cdh*_*wie 7

duration 可能会出现0,正数除以零会产生JavaScript中正无穷大的特殊值.

  • `speedBps`计算如下:`var speedBps = Math.round(bitsLoaded/duration);`.如果`duration`为0,则`speedBps`将为无穷大.而且由于其他两个速度变量是从"speedBps"计算出来的,因此它们也是无穷大. (3认同)

Tha*_*hai 7

只是不要围绕持续时间.

 var duration = (endTime - startTime) / 1000;
Run Code Online (Sandbox Code Playgroud)