使用 Firefox 和 Chromium 使用 HTTP/1.1 和 HTTP/1.0 下载图像的性能差异有显著吗?

使用 Firefox 和 Chromium 使用 HTTP/1.1 和 HTTP/1.0 下载图像的性能差异有显著吗?

当在本地设备上使用 Python Flask 在静态目录中托管包含许多小图像(大约 500 张大小 <100x100 像素的图像)的网页并分别使用 Firefox 74 和 Chrome 80 查看它时,注意到明显的性能差异:

  • 使用HTTP/1.0,加载时间为:Firefox 3.12s,Chrome 30s。
  • 使用HTTP/1.1,加载时间为:Firefox 3.68s,Chrome 1.7s。

看起来 Chromium 使用 HTTP/1.1 时速度很快,但使用 HTTP/1.0 时速度极慢。我想知道为什么会有这样的差异?


应用程序演示:

import os
from flask import Flask
from werkzeug.serving import WSGIRequestHandler
#WSGIRequestHandler.protocol_version = "HTTP/1.1"
os.chdir(os.path.abspath(os.path.dirname(__file__)))
app = Flask(__name__, static_folder='static')
app.run(host='127.0.0.1', port=8000)
  • 安装 Python 3.5+。
  • 安装Flask pip install flask:。
  • 将上述脚本保存为app.py
  • 在与 同一目录中创建一个index.html包含约 500 幅图像的HTML 页面。staticapp.py
  • 运行app.py以启动本地服务器。
  • localhost:8000/static/index.html在浏览器中访问。
  • #从注释行中删除主机 HTTP/1.1,而不是 HTTP/1.0。

答案1

HTTP/1.1 中关于持久连接有许多性能改进:

  • 默认持久性RFC 7230, 6.3)(通过单个连接发送多个请求和响应)

  • 分块传输编码RFC 2616, 3.6.1,更新者RFC 7230, 3.3.1)“允许动态生成的内容与接收者验证是否已收到完整消息所需的信息一起进行传输。”

  • 流水线RFC 7230,6.3.2)“(即发送多个请求而不等待每个响应)”

  • 范围请求RFC 7233),尽管它们并不适用于您的用例。

因此,HTTP/1.0 和 Firefox 74 的性能更好很可能是测量错误,而 Google Chrome 80 的结果似乎合理。我猜图像已经缓存在 Firefox 中了。

然而,如今你不必再担心 HTTP/1.0,这是一个 1996 年的古老协议。根据 W3Techs使用统计截至 2020 年 3 月,44% 的网站已经迁移到HTTP/2RFC 7540),提供更多性能改进:

  • 二进制数据格式减少传输的数据量。

  • 报头压缩第4.3节) 和重复使用

  • 持久 TCP 连接即通过单个连接同时进行多个下载。

  • 流和多路复用第 5 节)。

  • 服务器推送第8.2节)允许服务器推送客户端尚未请求的资源。

这些可能会给显著地在您的用例中具有更好的性能。此外,HTTP/3(使用 QUIC)即将推出;它已在 Firefox(从 72.0.1 开始)和 Chrome(从 79 开始)中得到支持。忘记 HTTP/1.0 – 是时候继续前进了。

相关内容