写点什么

C++ vs Rust vs Go 性能比较

作者:俞凡
  • 2024-12-30
    上海
  • 本文字数:1811 字

    阅读完需:约 6 分钟

本文对 C++、Rust 和 Go 三种编程语言编写的 gunzip 程序进行了性能比较,通过基准测试试图尽可能公平的比较它们的性能。原文: Performance — C++ vs Rust vs Go


本文将通过一些基准测试,比较 C++ 和 Rust 以及 Go 编写的相同程序的性能。我们将尽最大努力将语言差异以外的噪音因素隔离开来,不过,与任何基准测试一样,需要慎重对待测试结果,因为没有任何一种基准测试能真正比较两种不同语言的性能。

计划

本文要比较的程序是 gunzip,它可以解压 .gz 文件。gunzip 有不同的实现,例如用 C 编写的 GNU gzip、用 C 编写的 zlib、用 C 编写的 miniz、用 Rust 编写的 flate2-rs 和用 Go 编写的 gzip


但是,除非一种语言是另一种语言的直接移植,由于可能会引入不同实现的噪音,因此无法对两种语言进行准确的基准测试。


为此,我们将选择以下三个方面:


尽量减少噪音

还有一个问题--外部库。它们都依赖第三方库计算 CRC32 校验和,这在解压缩过程中会耗费大量时间。其中,gunzip 依赖 crc32fastcpp_gunzip 可以链接 zlib 或 FastCrc32,而 go_gunzip 则依赖 Go 标准库里的 crc32。幸运的是,所有这些程序都支持多线程选项,可以在单独的线程上运行 CRC32 校验和,因此运行时间与解压缩实现成正比--这是因为解压缩比 CRC32 校验和耗时更长,因此通过并行化,可以有效的将 CRC32 校验和的影响降至最低。


让我们做一些实验来验证。我们用两种不同的方式编译 cpp_gunzip:(1) 使用 FastCrc32;(2) 使用 zlib 计算 CRC32 校验和。然后使用单线程和双线程模式比较两者的运行时间,看看有什么不同。


# terminal in Linuxgit clone https://github.com/TechHara/cpp_gunzip.gitcd cpp_gunzip
# compile with FastCrc32 vs zlib for CRC32 checksumcmake -B fastcrc32 -DCMAKE_CXX_FLAGS=-O3 -DUSE_FAST_CRC32=ON . && make -j -C fastcrc32cmake -B zlib -DCMAKE_CXX_FLAGS=-O3 -DUSE_FAST_CRC32=OFF . && make -j -C zlib
# download linux source code and compress as .gz filecurl -o- https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.8.7.tar.xz | xz -d | gzip > linux.tgz
# run with single-threadtime fastcrc32/gunzip < linux.tgz > linux.tartime zlib/gunzip < linux.tgz > linux.tar
# run with multi-thread (-t option)time fastcrc32/gunzip -t < linux.tgz > linux.tartime zlib/gunzip -t < linux.tgz > linux.tar
复制代码



在 x64 Ubuntu 系统上,单线程模式下两个 CRC32 校验和库的性能差别很大。不过,当我们在多线程模式下运行时,这两个库的运行时间并没有出现预期的差异。因此,这让我们可以最大限度减少基准测试时使用不同 CRC32 库所带来的噪音。

基准测试

接下来我们将运行基准,使用完全相同的 .gz 解压缩实现,比较 C++ 与 Rust 和 Go 的性能。我们已经运行了 C++ 版本,现在来运行 Rust 和 Go 版本。确保在多线程模式下运行,以尽量减少 CRC32 校验和产生的噪音。


# clone the Rust versiongit clone https://github.com/TechHara/gunzip.gitcd gunzip
# buildcargo build -r
# run in multi-threaded mode (-t)time target/release/gunzip -t < ../linux.tgz > linux.tar
# clone the Go versioncd ..git clone https://github.com/TechHara/go_gunzip.gitcd go_gunzip
# buildgo build
# set max process to 2export GOMAXPROCS=2
# run in multi-threaded mode (-t)time ./gunzip -t < ../linux.tgz > linux.tar
复制代码



好吧,在 x64 Ubuntu 系统上,C++ 和 Rust 的运行速度几乎相同,而 Go 的运行时间是它们的 2 倍左右。但与 benchmarkgame 的数据(4 倍)相比,在这个场景下的 Go 性能还更好一点。



但更好的性能并不意味着更好的语言。在选择语言时,必须考虑应用、开发/维护时间以及安全性。最典型的例子就是 Python,它比 C 语言慢 100 倍,但却是最流行的编程语言。




你好,我是俞凡,在 Motorola 做过研发,现在在 Mavenir 做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI 等技术始终保持着浓厚的兴趣,平时喜欢阅读、思考,相信持续学习、终身成长,欢迎一起交流学习。为了方便大家以后能第一时间看到文章,请朋友们关注公众号"DeepNoMind",并设个星标吧,如果能一键三连(转发、点赞、在看),则能给我带来更多的支持和动力,激励我持续写下去,和大家共同成长进步!

发布于: 刚刚阅读数: 6
用户头像

俞凡

关注

公众号:DeepNoMind 2017-10-18 加入

俞凡,Mavenir Systems研发总监,关注高可用架构、高性能服务、5G、人工智能、区块链、DevOps、Agile等。公众号:DeepNoMind

评论

发布
暂无评论
C++ vs Rust vs Go 性能比较_c++_俞凡_InfoQ写作社区