当在本地设备上使用 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 页面。static
app.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/2(RFC 7540),提供更多性能改进:
二进制数据格式减少传输的数据量。
报头压缩(第4.3节) 和重复使用。
持久 TCP 连接即通过单个连接同时进行多个下载。
流和多路复用(第 5 节)。
服务器推送(第8.2节)允许服务器推送客户端尚未请求的资源。
这些可能会给显著地在您的用例中具有更好的性能。此外,HTTP/3(使用 QUIC)即将推出;它已在 Firefox(从 72.0.1 开始)和 Chrome(从 79 开始)中得到支持。忘记 HTTP/1.0 – 是时候继续前进了。