Golang Go语言和Rust的Hello World Benchmark测试结果令人好奇

发布于 1周前 作者 zlyuanteng 来自 Go语言

我在 Gin 、Actix 和 Axum 上使用 wrk 做了一些测试。Actix 和 Axum 使用 MiMalloc 作为分配器,发布配置文件包括以下设置:Lto=true 、opt-level=3 和 codegen-units=1 。

平均而言,Go 的延迟小于 1ms ,令人难以置信,而 Actix 的延迟要高得多,但吞吐量/rps 仍优于 Gin 。

我很好奇,为什么 Gin 的延迟如此之小,而 Qps 却远低于另外两个。


结果如下:

Gin (go):

> wrk -t8 -c100 -d30s http://localhost:3000/

Running 30s test @ http://localhost:3000/

8 threads and 100 connections

Thread Stats Avg Stdev Max +/- Stdev

Latency 823.52us 1.16ms 25.86ms 88.29%

Req/Sec 22.94k 12.27k 118.70k 81.71%

5488891 requests in 30.07s, 680.50MB read

Requests/sec: 182521.70

Transfer/sec: 22.63MB


axum (rust):

> wrk -t8 -c100 -d30s http://localhost:3000/

Running 30s test @ http://localhost:3000/

8 threads and 100 connections

Thread Stats Avg Stdev Max +/- Stdev

Latency 3.87ms 13.64ms 225.34ms 93.67%

Req/Sec 40.34k 23.31k 183.63k 73.83%

9516362 requests in 30.09s, 1.15GB read

Requests/sec: 316292.39

Transfer/sec: 39.21MB


actix (rust):

> wrk -t8 -c100 -d30s http://localhost:3000/

Running 30s test @ http://localhost:3000/

8 threads and 100 connections

Thread Stats Avg Stdev Max +/- Stdev

Latency 34.43ms 66.10ms 541.12ms 86.22%

Req/Sec 42.77k 37.73k 214.31k 77.25%

9169105 requests in 30.09s, 769.50MB read

Requests/sec: 304762.55

Transfer/sec: 25.58MB


Golang Go语言和Rust的Hello World Benchmark测试结果令人好奇

更多关于Golang Go语言和Rust的Hello World Benchmark测试结果令人好奇的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

12 回复

测试环境:
Mac Sonoma 14.4.1
MacBook Air M2

更多关于Golang Go语言和Rust的Hello World Benchmark测试结果令人好奇的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


看上去数据包大小有区别,可能应该是返回的 response 不一样,不同的框架可能默认返回不一致,这里有做对比吗

了解 go ,不懂 rust 。我猜测是框架的处理问题,算力一定的情况下,如果增大缓冲区,那么就能吞吐更多连接,那相应的单个连接的处理速度就会更慢,延迟就会更高

看了下,response 基本一样,actix 的 response 头还少一行 content-type: text/plain; charset=utf-8
请问 Gin 的缓冲区怎样加?是监听 socket 的缓冲区吗?

1.rust 无 gc

#5 2.不同的框架实现不一样,axum 框架有他自己的特性,它的性能好,我理解是正常的

代码贴一下?

actix 是每个 thread 起一个 runtime ,M2 的核心又是不对称的,所以延迟爆炸很正常。go 和 tokio(axum 用法)都是有任务窃取的,所以受影响不大。

helloworld 能测出什么? go 跟 rust 一个主要区别是 gc

你测试代码呢?可以把 fasthttp 也加进来一起测试下。

盲猜 rust 没有开 nodelay ,或者框架自己有缓存,然后批量发送。

针对“Golang(Go语言)和Rust的Hello World Benchmark测试结果”这一话题,作为IT领域GO语言方面的专家,我认为以下几点值得探讨:

  1. 测试内容:Hello World Benchmark测试通常用于评估不同编程语言或框架在基础任务上的性能。虽然这种测试较为简单,但它能反映出语言的编译速度、启动速度等基础性能。
  2. 性能差异:Rust以其卓越的性能著称,而Go语言也以其高效和简洁闻名。在实际测试中,两者可能因实现方式、编译器优化等因素而表现出不同的性能。但需要注意的是,Hello World测试的结果可能无法全面反映语言在复杂应用中的性能表现。
  3. 解读结果:在解读测试结果时,应关注测试环境、测试方法以及结果的重复性。同时,还要考虑到不同语言的特点和优势,以及它们在特定应用场景下的适用性。
  4. 选择语言:对于开发者来说,选择哪种语言应基于项目的实际需求、团队的技术储备以及个人的偏好。Go语言和Rust各有千秋,选择时需权衡利弊。

总之,Hello World Benchmark测试结果虽然有趣,但应理性看待其意义。在实际开发中,更应考虑语言的综合性能和适用性。

回到顶部