C++ vs Rust vs Go 性能比较

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

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

计划

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

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

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

  • 用 Rust 写的 gunzip [6]
  • C++ 编写的移植版 cpp_gunzip
  • Go 编写的移植版 go_gunzip
尽量减少噪音

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

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

# terminal in Linux
git clone https://github.com/TechHara/cpp_gunzip.git
cd cpp_gunzip

# compile with FastCrc32 vs zlib for CRC32 checksum
cmake -B fastcrc32 -DCMAKE_CXX_FLAGS=-O3 -DUSE_FAST_CRC32=ON . && make -j -C fastcrc32
cmake -B zlib -DCMAKE_CXX_FLAGS=-O3 -DUSE_FAST_CRC32=OFF . && make -j -C zlib

# download linux source code and compress as .gz file
curl -o- https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.8.7.tar.xz | xz -d | gzip > linux.tgz

# run with single-thread
time fastcrc32/gunzip < linux.tgz > linux.tar
time zlib/gunzip < linux.tgz > linux.tar

# run with multi-thread (-t option)
time fastcrc32/gunzip -t < linux.tgz > linux.tar
time zlib/gunzip -t < linux.tgz > linux.tar
alt

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

基准测试

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

# clone the Rust version
git clone https://github.com/TechHara/gunzip.git
cd gunzip

# build
cargo build -r

# run in multi-threaded mode (-t)
time target/release/gunzip -t < ../linux.tgz > linux.tar

# clone the Go version
cd ..
git clone https://github.com/TechHara/go_gunzip.git
cd go_gunzip

# build
go build

# set max process to 2
export GOMAXPROCS=2

# run in multi-threaded mode (-t)
time ./gunzip -t < ../linux.tgz > linux.tar
alt

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

https://benchmarksgame-team.pages.debian.net/benchmarksgame/index.html
https://benchmarksgame-team.pages.debian.net/benchmarksgame/index.html

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


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

参考资料
[1]

GUN gzip: https://www.gnu.org/software/gzip

[2]

zlib: https://www.zlib.net

[3]

miniz: https://github.com/richgel999/miniz

[4]

flate2-rx: https://github.com/rust-lang/flate2-rs

[5]

gzip in Go: https://pkg.go.dev/compress/gzip

[6]

gunzip in Rust: https://github.com/techhara/gunzip

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/326185.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu20.04右键打不开终端

今天用virtualbox安装了ubuntu20.04 问题&#xff1a;右键打开终端&#xff0c;怎么也打开不了&#xff01; 点了也没反应&#xff0c;或者鼠标转小圈圈&#xff0c;然后也没有反应… 解决方法&#xff1a; 1、Ctrl Alt F6 先切换到终端访问界面 mac电脑 Ctrl Alt F6 …

计算机网络【应用层】邮件和DNS

文章目录 电子邮件DNSDNS提供的服务&#xff1a;域名分级域名解析流程DNS资源记录DNS服务器类型 电子邮件 使用SMTP协议发送邮件之前&#xff0c;需要将二进制多媒体数据编码为ASCII码SMTP一般不使用中间邮件服务器发送邮件&#xff0c;如果收件服务器没开机&#xff0c;那么会…

鸿蒙内核源码分析(消息封装篇) | 剖析LiteIpc(上)进程通讯内容

基本概念 LiteIPC是OpenHarmony LiteOS-A内核提供的一种新型IPC&#xff08;Inter-Process Communication&#xff0c;即进程间通信&#xff09;机制&#xff0c;为轻量级进程间通信组件&#xff0c;为面向服务的系统服务框架提供进程间通信能力&#xff0c;分为内核实现和用户…

测试人的福音:开源流量回放工具快速上手实践

笔者前段时间在参加测开大会时了解到了一款开源的自动化回归测试工具 AREX。主要是通过复制线上真实流量到测试环境进行回归测试&#xff0c;同时还做到了接口返回值的比对和写接口的验证&#xff0c;回放不会产生真实的数据或者调用&#xff0c;都是基于 Mock 数据的&#xff…

5分钟学设计模式:简单工厂与美食街的不期而遇

大家好&#xff0c;我是知微。 写代码好几年&#xff0c;是不是还纠结于这些问题&#xff1a; 面对一堆if-else&#xff0c;代码越写越长&#xff0c;维护起来比攀登珠穆朗玛峰还难每次只敢小心翼翼改个小功能&#xff0c;生怕程序突然“嘭”一声&#xff0c;全炸了想学习大佬…

18.Docker学习

1.Docker应用场景 Docker借鉴了标准集装箱的概念。标准集装箱将货物运往世界各地&#xff0c;Docker&#xff08;模板&#xff09;将软件运往各个环境&#xff08;测试环境和生产环境拉取镜像&#xff08;实例&#xff09;&#xff09;&#xff0c;相当于是一个模子刻出来的 …

计算机毕业设计springboot+vue高校教师职称评审评定系统605z3

技术栈 前端&#xff1a;vue.jsElementUI 开发工具&#xff1a;IDEA 或者eclipse都支持 编程语言: java 框架&#xff1a; ssm/springboot 数据库: mysql 版本不限 数据库工具&#xff1a;Navicat/SQLyog都可以 详细技术&#xff1a;javaspringbootvueMYSQLMAVEN 本系统采用in…

Google Pixel4手机刷机+Root+逆向环境详细教程

Google Pixel4手机刷机Root逆向环境配置详细教程 刷机工具下载 Windows10、Google Pixel4手机当前安卓10系统、adb工具、要刷的谷歌原生的Android11最新刷机包、安装google usb驱动、美版临时twrp-3.6.0_11-0-flame.img和美版永久twrp-installer-3.6.0_11-0-flame.zip、Magis…

如何使用Shortemall自动扫描URL短链接中的隐藏内容

关于Shortemall Shortemall是一款针对URL地址安全与Web内容安全的强大工具&#xff0c;该工具基于纯Python开发&#xff0c;专为Web安全方向设计&#xff0c;可以帮助广大研究人员以自动化的形式扫描URL短链接中的隐藏内容。 Shortemall的全名为ShortEm All&#xff0c;该工具…

乡村振兴与乡村旅游深度融合:依托乡村自然和文化资源,发展乡村旅游产业,促进农民增收致富,打造特色美丽乡村

目录 一、引言 二、乡村振兴与乡村旅游的内在联系 三、依托乡村自然和文化资源发展乡村旅游产业 &#xff08;一&#xff09;挖掘乡村自然资源优势&#xff0c;打造特色旅游品牌 &#xff08;二&#xff09;挖掘乡村文化资源内涵&#xff0c;丰富旅游活动内容 四、促进农…

IP SSL怎么签发使用

IP证书的签发首先是需要有一个可供绑定的IP地址&#xff0c;作为常用数字证书之一&#xff0c;IP证书也因为其广泛的应用范围而深得用户的青睐和喜欢。 部署IP证书后&#xff0c;可以实现该IP地址的https访问&#xff0c;过程和域名证书相差不多。 IP证书和域名证书的区别 很…

接收区块链的CCF会议--NDSS 2025 截止7.10 附录用率

会议名称&#xff1a;Network and Distributed System Security Symposium (NDSS) CCF等级&#xff1a;CCF A类学术会议 类别&#xff1a;网络与信息安全 录用率&#xff1a;2024年接收率19.5% Submissions are solicited in, but not limited to, the following areas: Ant…

《系统管理学报》期刊投稿经验与流程分享(一轮退修,历时3月)

双非研二&#xff0c;三作&#xff08;导师一作&#xff0c;师哥二作&#xff09;&#xff0c;《系统管理学报》期刊录用 投稿网址&#xff1a;https://xtglxb.sjtu.edu.cn/journalx_jgxb/authorLogOn.action 投稿&收稿&#xff1a;2022年12月26日初审&#xff1a;2023年…

强大的开源项目RAG-GPT:5分钟实现LLM大模型应用到你的网站!

强大的开源项目RAG-GPT&#xff1a;5分钟实现LLM大模型应用到你的网站&#xff01; 引言 随着chatgpt等大型语言模型&#xff08;LLM&#xff09;能力越来越强大&#xff0c;如何将这些模型精准地应用于特定垂直领域&#xff0c;让各行业开发者快速利用LLM赋能也成为热点和痛…

WS2811 单线 256 级灰度三通道恒流 LED 驱动器芯片 IC

产品概述 WS2811 是三通道LED驱动控制专用电路&#xff0c;芯片内部包含了智能数字接口数据锁存信号整形放大驱动电路&#xff0c;还包含有高精度的内部振荡器和15V高压可编程定电流输出驱动器。同时&#xff0c;为了降低电源纹波&#xff0c;3个通道有一定的延时导通功…

4.1 文本相似度(二)

目录 1 文本相似度评估 2 代码 2.1 load_dataset 方法 2.2 AutoTokenizer、AutoModelForSequenceClassification 1 文本相似度评估 对两个文本拼接起来&#xff0c;然后作为一个样本喂给模型&#xff0c;作为一个二分类的任务&#xff1b; 数据处理的方式以及训练的基本流程…

2024最新版JavaScript逆向爬虫教程-------基础篇之无限debugger的原理与绕过

目录 一、无限debugger的原理与绕过1.1 案例介绍1.2 实现原理1.3 绕过debugger方法1.3.1 禁用所有断点1.3.2 禁用局部断点1.3.3 替换文件1.3.4 函数置空与hook 二、补充2.1 改写JavaScript文件2.2 浏览器开发者工具中出现的VM开头的JS文件是什么&#xff1f; 三、实战 一、无限…

一篇文章掌握所有国债期货的基本交易策略介绍

国债期货是一种基本的利率衍生品&#xff0c;根据交易者交易目的不同&#xff0c;可以将期货交易行为分为三类&#xff1a;套期保值、套利交易和投机交易。套期保值是投资者为了避免现有或将来预期的投资组合价值受市场利率变动的影响&#xff0c;而在国债期货市场上采取抵消性…

2023年30米分辨率土地利用遥感监测数据

改革开放以来&#xff0c;中国经济的快速发展对土地利用模式产生了深刻的影响。同时&#xff0c;中国又具有复杂的自然环境背景和广阔的陆地面积&#xff0c;其土地利用变化不仅对国家发展&#xff0c;也对全球环境变化产生了深刻的影响。为了恢复和重建我国土地利用变化的现代…

六、Redis五种常用数据结构-zset

zset是Redis的有序集合数据类型&#xff0c;但是其和set一样是不能重复的。但是相比于set其又是有序的。set的每个数据都有一个double类型的分数&#xff0c;zset正是根据这个分数来进行数据间的排序从小到大。有序集合中的元素是唯一的&#xff0c;但是分数(score)是可以重复的…