我正在编写一个速度测试来确定浏览器-服务器连接速度(js+php,但我认为这并不重要)。我发送了一堆不同大小的数据包,并测量它们分别到达服务器(上传)和客户端(下载)所需的时间。
当我还在开发机器上时(服务器和客户端在同一台机器上),我测量到的上传速度偏差比下载速度偏差大得多。看看这些测量结果:
Uploaded kb | 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128 | 256 | 512 | 1024 | 2048 | 4096 | Average byte/sec
-------------------------------------------------------------------------------------------------------------------------
ms series 1 | 3 | 9 | 7 | 3 | 11 | 10 | 11 | 5 | 13 | 19 | 37 | 47 | 130 | 14.9344274575002
ms series 2 | 2 | 7 | 2 | 2 | 7 | 3 | 5 | 7 | 11 | 16 | 28 | 46 | 86 | 18.5357872423498
ms series 3 | 6 | 3 | 4 | 2 | 3 | 3 | 4 | 7 | 8 | 14 | 37 | 50 | 113 | 18.0964908223754
ms series 4 | 9 | 6 | 7 | 6 | 2 | 3 | 12 | 16 | 10 | 23 | 25 | 51 | 85 | 16.6696396851004
ms series 5 | 8 | 2 | 3 | 88 | 7 | 4 | 4 | 6 | 10 | 19 | 38 | 46 | 99 | 16.989223651609
Downl. kb | 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128 | 256 | 512 | 1024 | 2048 | 4096 | Average byte/sec
-------------------------------------------------------------------------------------------------------------------------
ms series 1 | 67 | 14 | 54 | 33 | 44 | 35 | 29 | 59 | 90 | 105 | 220 | 394 | 780 | 2.28178300694085
ms series 2 | 34 | 88 | 52 | 85 | 22 | 26 | 38 | 43 | 61 | 108 | 180 | 368 | 721 | 2.57923191272149
ms series 3 | 26 | 16 | 126 | 73 | 16 | 40 | 44 | 38 | 74 | 120 | 186 | 381 | 691 | 2.48128561711253
ms series 4 | 23 | 7 | 12 | 14 | 27 | 21 | 18 | 44 | 74 | 97 | 182 | 413 | 919 | 2.6496804364072
ms series 5 | 19 | 13 | 11 | 74 | 67 | 25 | 72 | 34 | 61 | 93 | 181 | 347 | 677 | 2.69509313778383
ms series 6 | 40 | 60 | 33 | 14 | 62 | 48 | 64 | 29 | 51 | 94 | 171 | 330 | 700 | 2.80628837904148
ms series 7 | 25 | 8 | 32 | 61 | 26 | 18 | 19 | 29 | 52 | 100 | 169 | 357 | 676 | 3.04519001690114
上传速度大约是快点比下载速度快,我无法解释。由于一切都发生在同一台机器上,并且没有任何上传方式,包括网络提供商或其他任何方式,我会假设一切或多或少都相同。此外,正如您在最后一列中看到的那样,上传测试的平均字节/秒变化更大(从 14.9 到 18.5,因此范围是 3.6 两个字节/秒),而下载测试则不同(从 2.2 到 3.0,范围是 0.8)。当然不是确切的值,但平均上传速度比平均下载速度变化大得多这一事实是完全可以重现的(在我的本地机器上,没有在真实的服务器/客户端场景中尝试过)。
知道为什么上传速度比下载速度快得多并且变化很大吗?
附录:我该如何测量?
上传:
在调用 do 之前const startingTime = new Date().getTime();
,使用 向服务器发送 x 个随机 base64 字符包xhr
。返回到达时间(PHP 的$_SERVER['REQUEST_TIME_FLOAT']
)并xhr.load
计算:
testResult.duration = arrivalTime - startingTime;
下载:
向服务器发送请求,请求大小为:返回一个包含 x 个 base64 字符的包,其中包含调用的到达时间(同样是 PHP 的$_SERVER['REQUEST_TIME_FLOAT']
),并xhr.load
计算:
const currentTime = new Date().getTime();
testResult.duration = currentTime - arrivalTime;
答案1
我认为问题在于您依赖于用 $_SERVER['REQUEST_TIME_FLOAT'] 测量的 PHP 执行的开始时间,该时间的精度为 1 微秒,并将其与 Javascript 的 Date.getTime() 方法(精度为 1 秒)进行比较。
您需要的是一个高分辨率计时器,这在浏览器中很难实现。
最好的办法可能是在所有测试中使用 PHP 的 $_SERVER['REQUEST_TIME_FLOAT'] 作为开始时间和停止时间。它确实是最强大的本机计时器之一。或者使用 Python 等桌面语言作为客户端应用程序,它具有比 Javascript 更好的高精度计时器。