跳转到内容

不同框架之间的性能对比

请先阅读此内容

在深入之前,需要强调的是,本次性能对比的目的并非贬低任何开发者或下列所提及的框架。列出框架名称只是为了使对比更清晰。我对 Python-Web 生态系统的偏好很大程度上受到了这些框架的影响,在这里列出它们并不是为了冒犯任何人。

此外,这些测试是在我个人开发设备上进行的,因此,以下展示的数据并非绝对值。这些数据仅用于反映在特定测试条件下这些框架的相对性能。

使用 oha 工具对以下框架进行 10,000 个请求的测试,并得出了以下结果:

  1. Flask(Gunicorn)
bash
Total:        5.5254 secs
Slowest:      0.0784 secs
Fastest:      0.0028 secs
Average:      0.0275 secs
Requests/sec: 1809.8082
  1. FastAPI(Uvicorn)
bash
Total:        4.1314 secs
Slowest:      0.0733 secs
Fastest:      0.0027 secs
Average:      0.0206 secs
Requests/sec: 2420.4851
  1. Django(Gunicorn)
bash
Total:        13.5070 secs
Slowest:      0.3635 secs
Fastest:      0.0249 secs
Average:      0.0674 secs
Requests/sec: 740.3558
  1. Robyn(Doesn't need a *SGI)
bash
Total:	1.8324 secs
Slowest:	0.0269 secs
Fastest:	0.0024 secs
Average:	0.0091 secs
Requests/sec:	5457.2339
  1. Robyn (5 workers)
bash
Total:	1.5592 secs
Slowest:	0.0211 secs
Fastest:	0.0017 secs
Average:	0.0078 secs
Requests/sec:	6413.6480

Robyn 需要 1.8 秒处理 10,000 个请求,其次是 Flask 和 FastAPI,它们大约需要 5 秒(在配备双核处理器的机器上使用 5 个工作进程)。相比之下,Django 大约需要 13.5070 秒。

详细日志

Flask(Gunicorn)

bash
Summary:
  Success rate: 1.0000
  Total:        5.5254 secs
  Slowest:      0.0784 secs
  Fastest:      0.0028 secs
  Average:      0.0275 secs
  Requests/sec: 1809.8082

  Total data:   126.95 KiB
  Size/request: 13 B
  Size/sec:     22.98 KiB

Response time histogram:
  0.007 [55]   |
  0.014 [641]  |■■■■■
  0.021 [2413] |■■■■■■■■■■■■■■■■■■■■
  0.027 [3771] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  0.034 [1999] |■■■■■■■■■■■■■■■■
  0.041 [737]  |■■■■■■
  0.048 [236]  |■■
  0.055 [75]   |
  0.062 [46]   |
  0.069 [24]   |
  0.076 [3]    |

Latency distribution:
  10% in 0.0178 secs
  25% in 0.0223 secs
  50% in 0.0266 secs
  75% in 0.0317 secs
  90% in 0.0378 secs
  95% in 0.0419 secs
  99% in 0.0551 secs

Details (average, fastest, slowest):
  DNS+dialup:   0.0071 secs, 0.0001 secs, 0.0443 secs
  DNS-lookup:   0.0000 secs, 0.0000 secs, 0.0010 secs

Status code distribution:
  [200] 10000 responses

FastAPI(Uvicorn)

bash
Summary:
  Success rate: 1.0000
  Total:        4.1314 secs
  Slowest:      0.0733 secs
  Fastest:      0.0027 secs
  Average:      0.0206 secs
  Requests/sec: 2420.4851

  Total data:   166.02 KiB
  Size/request: 17 B
  Size/sec:     40.18 KiB

Response time histogram:
  0.005 [175]  |
  0.011 [1541] |■■■■■■■■■■■■■■■■
  0.016 [2942] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  0.021 [2770] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  0.027 [1479] |■■■■■■■■■■■■■■■■
  0.032 [608]  |■■■■■■
  0.038 [217]  |■■
  0.043 [103]  |
  0.048 [53]   |
  0.054 [54]   |
  0.059 [58]   |

Latency distribution:
  10% in 0.0120 secs
  25% in 0.0151 secs
  50% in 0.0194 secs
  75% in 0.0243 secs
  90% in 0.0300 secs
  95% in 0.0348 secs
  99% in 0.0522 secs

Details (average, fastest, slowest):
  DNS+dialup:   0.0088 secs, 0.0073 secs, 0.0103 secs
  DNS-lookup:   0.0001 secs, 0.0000 secs, 0.0008 secs

Status code distribution:
  [200] 10000 responses

Robyn

bash
Summary:
  Success rate:	1.0000
  Total:	1.8324 secs
  Slowest:	0.0269 secs
  Fastest:	0.0024 secs
  Average:	0.0091 secs
  Requests/sec:	5457.2339

  Total data:	117.19 KiB
  Size/request:	12 B
  Size/sec:	63.95 KiB

Response time histogram:
  0.002 [183]  |
  0.004 [1669] |■■■■■■■■■■■■■■
  0.007 [3724] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  0.009 [2631] |■■■■■■■■■■■■■■■■■■■■■■
  0.011 [1060] |■■■■■■■■■
  0.013 [496]  |■■■■
  0.016 [188]  |
  0.018 [34]   |
  0.020 [12]   |
  0.022 [2]    |
  0.025 [1]    |

Latency distribution:
  10% in 0.0061 secs
  25% in 0.0073 secs
  50% in 0.0087 secs
  75% in 0.0105 secs
  90% in 0.0129 secs
  95% in 0.0143 secs
  99% in 0.0171 secs

Details (average, fastest, slowest):
  DNS+dialup:	0.0049 secs, 0.0035 secs, 0.0065 secs
  DNS-lookup:	0.0001 secs, 0.0000 secs, 0.0010 secs

Status code distribution:
  [200] 10000 responses

Django(Gunicorn)

bash
Summary:
  Success rate: 1.0000
  Total:        13.5070 secs
  Slowest:      0.3635 secs
  Fastest:      0.0249 secs
  Average:      0.0674 secs
  Requests/sec: 740.3558

  Total data:   102.01 MiB
  Size/request: 10.45 KiB
  Size/sec:     7.55 MiB

Response time histogram:
  0.016 [283]  |
  0.032 [2616] |■■■■■■■■■■■■■■■■■■
  0.048 [4587] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  0.064 [1829] |■■■■■■■■■■■■
  0.081 [362]  |■■
  0.097 [98]   |
  0.113 [105]  |
  0.129 [20]   |
  0.145 [7]    |
  0.161 [28]   |
  0.177 [65]   |

Latency distribution:
  10% in 0.0493 secs
  25% in 0.0559 secs
  50% in 0.0638 secs
  75% in 0.0733 secs
  90% in 0.0840 secs
  95% in 0.0948 secs
  99% in 0.1543 secs

Details (average, fastest, slowest):
  DNS+dialup:   0.0097 secs, 0.0001 secs, 0.0444 secs
  DNS-lookup:   0.0000 secs, 0.0000 secs, 0.0007 secs

Status code distribution:
  [200] 10000 responses

Robyn(with 5 workers)

bash
Summary:
  Success rate:	1.0000
  Total:	1.5592 secs
  Slowest:	0.0211 secs
  Fastest:	0.0017 secs
  Average:	0.0078 secs
  Requests/sec:	6413.6480

  Total data:	126.95 KiB
  Size/request:	13 B
  Size/sec:	81.42 KiB

Response time histogram:
  0.002 [30]   |
  0.004 [599]  |■■■■■
  0.005 [3336] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  0.007 [3309] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  0.009 [1614] |■■■■■■■■■■■■■■■
  0.011 [749]  |■■■■■■■
  0.012 [253]  |■■
  0.014 [94]   |
  0.016 [14]   |
  0.018 [1]    |
  0.019 [1]    |

Latency distribution:
  10% in 0.0055 secs
  25% in 0.0063 secs
  50% in 0.0074 secs
  75% in 0.0089 secs
  90% in 0.0107 secs
  95% in 0.0117 secs
  99% in 0.0142 secs

Details (average, fastest, slowest):
  DNS+dialup:	0.0022 secs, 0.0013 secs, 0.0028 secs
  DNS-lookup:	0.0000 secs, 0.0000 secs, 0.0001 secs

Status code distribution:
  [200] 10000 responses

基于 MIT 许可发布