Javascript获取速度慢(60毫秒vs 3毫秒)

Javascript获取速度慢(60毫秒vs 3毫秒),javascript,fetch-api,Javascript,Fetch Api,在我的机器上运行Javascript每次调用大约需要60毫秒。与3ms的Python相比,这要慢得多 问题 为什么fetch要慢得多 有没有办法加快速度?我同意需要重新配置浏览器的答案 实验 这些是我实验的细节 系统 浏览器:Firefox 74.0(64位) 操作系统:Ubuntu 18.04.4 LTS 服务器:Django3.0.3(但由于请求要快得多,这应该无关紧要)。服务器和客户端在同一台计算机上 对于请求:带有请求的Python 3.7.62.23.0 处理器:英特尔(R)核

在我的机器上运行Javascript每次调用大约需要60毫秒。与3ms的Python相比,这要慢得多

问题
  • 为什么
    fetch
    要慢得多
  • 有没有办法加快速度?我同意需要重新配置浏览器的答案

实验 这些是我实验的细节

系统
  • 浏览器:Firefox 74.0(64位)
  • 操作系统:Ubuntu 18.04.4 LTS
  • 服务器:Django3.0.3(但由于
    请求
    要快得多,这应该无关紧要)。服务器和客户端在同一台计算机上
  • 对于
    请求
    :带有
    请求的Python 3.7.6
    2.23.0
  • 处理器:英特尔(R)核心(TM)i5-6600K处理器@3.50GHz
Javascript获取 运行以下Javascript的HTML:


生成多个
fetch
请求并报告每个请求的平均时间的Javascript

// record all times
const times = [];

function call() {
    // record starting time
    const startFetch = performance.now();
    fetch("http://127.0.0.1:8000/timer/time")
        .then((response) => {
            // compute fetch duration
            const elapsedFetch = performance.now() - startFetch;

            // record result
            console.log(elapsedFetch);
            times.push(elapsedFetch);

            if (times.length<100) {
                // start next call
                call();
            } else {
                // report statistics
                const totalFetch = times.reduce((a, b) => a + b, 0);
                const averageFetch = totalFetch/times.length;
                const standardDeviation = Math.sqrt(times.reduce((a, b) => a + (b-averageFetch) ** 2, 0)/times.length);
                const totalElapsed = performance.now() - startTime;
                console.log("Average fetch time:", averageFetch, '+-', standardDeviation);
                console.log("Percentage of overall elapsed:", totalFetch/totalElapsed)
            }
        });
}

var startTime = performance.now();
call();
谷歌Chrome版本80.0.3987.149(官方版本)(64位)的类似结果

使用而不是
获取

xhr.open("GET", "http://127.0.0.1:8000/timer/time");
xhr.send();
xhr.onload = ...
产生类似的结果:

Average fetch time: 60.19 +- 26.325157169521326
Percentage of overall elapsed: 0.9993358791300017
Python请求 代码类似于Javascript,但使用Python:

导入请求
导入时间
将numpy作为np导入
时间=[]
开始时间=time.time()
对于范围(100)内的i:
start\u get=time.time()
response=requests.get('http://127.0.0.1:8000/timer/time')
已用\u get=时间。time()-开始\u get
时间+=[经过的时间]
总运行时间=时间。时间()-开始时间
total_get=np.sum(次)
平均值=np.平均值(次)
标准偏差=np.std(次)
打印(“平均获取时间:”,平均获取“+-”,标准偏差)
打印(“总运行时间百分比:”,总运行时间/总运行时间)
输出:

Average get time: 0.0025661182403564453 +- 0.0001961814487345112
Percentage of overall elapsed: 0.9994576986364464

虽然我仍然不知道Javascript获取为何如此缓慢,但我已经能够切换到更快的选项:


我现在使用(在客户端)和(在服务器上),这两种方法的速度要快得多。

我认为fetch映射了您收到的数据,但这可能是原因所在。您是否尝试过xmlhttprequest基本请求速度?您正在将请求的浏览器实现与python模块进行比较——这是不可比较的(苹果和橙子)。一个更好的比较是
fetch
xhtprequest
,正如@BenBeri所说,
fetch
比python
请求
做了更多的工作,想想看
fetch
在浏览器中,所以它需要考虑
跨源
、安全性、cookies等等。然后以安全的方式保存输出,而python
request
不必关心所有这些现成的东西。更重要的是,为什么这一点很重要?@Peter我认为这并不是这里发生的事情的准确描述。坦率地说,不管怎样,你试图做的是一个有缺陷的方法。如果您需要每10毫秒更新一次,那么每次发出一个新的HTTP请求(可能还有一个新的TCP连接)是错误的做法。而且,我们不能在没有关于你正在做什么的信息的情况下建议正确的方法。
Average fetch time: 60.19 +- 26.325157169521326
Percentage of overall elapsed: 0.9993358791300017
Average get time: 0.0025661182403564453 +- 0.0001961814487345112
Percentage of overall elapsed: 0.9994576986364464