赞
踩
本文运行一些基准测试并比较使用 C++
与 Rust
与 Go
编写的相同程序的性能。
尽力将噪音与语言差异以外的因素隔离开来。然而,与任何基准测试一样,我们对结果持保留态度——没有任何一个基准测试可以真正比较两种不同语言的性能。
本文将比较的程序是解压缩 .gz 文件的 gunzip 。
gunzip 有不同的实现,例如 C 编写的 GNU gzip、 C 编写的 zlib、 C 编写的 miniz、flate2 -rs 写在 Rust 中,gzip 写在 Go 中。
然而,我们无法准确地对两种语言进行基准测试,除非一种语言是另一种语言的直接移植,因为这会引入来自可能不同实现的噪音。
因此,我们将选择以下三个
Rust
编写C++
编写的直接端口Go
编写的直接端口还有一个问题——外部库的使用。他们依赖第三方库来计算 CRC32
校验和,这在解压过程中需要大量时间。特别是,gunzip 依赖于 crc32fast crate,cpp_gunzip 可以链接到 zlib 或 FastCrc32,而 go_gunzip 依赖于 Go
标准 crc32 库。幸运的是,它们都支持多线程选项,在单独的线程上运行 CRC32
校验和,从而导致运行时间仅与它们共享的 Inflate
(解压缩)实现成比例 - 这是因为 Inflate
比 CRC32
校验和花费的时间更长,因此通过并行化,我们可以有效地最小化 CRC32
校验和的贡献。
让我们进行一些实验来验证一下。让我们以两种不同的方式编译 cpp_gunzip:(1) 使用 FastCrc32 和 (2) zlib 计算 CRC32 校验和。然后,我们将使用单线程和双线程模式比较两者的运行时间,看看它们有何不同。
- # terminal in Linux
- git clone https://github.com/TechHara/cpp_gunzip.git
- cd cpp_gu
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。