当前位置:首页 > 科技  > 软件

C++ vs Rust vs Go 性能比较

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

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

C1G28资讯网——每日最新资讯28at.com

计划

本文要比较的程序是 gunzip,它可以解压 .gz 文件。gunzip 有不同的实现,例如用 C 编写的 GNU gzip[2]、用 C 编写的 zlib[3]、用 C 编写的 miniz[4]、用 Rust 编写的 flate2-rs[5] 和用 Go 编写的 gzip[6]。C1G28资讯网——每日最新资讯28at.com

但是,除非一种语言是另一种语言的直接移植,由于可能会引入不同实现的噪音,因此无法对两种语言进行准确的基准测试。C1G28资讯网——每日最新资讯28at.com

C1G28资讯网——每日最新资讯28at.com

为此,我们将选择以下三个方面:C1G28资讯网——每日最新资讯28at.com

  • 用 Rust 写的 gunzip[7]
  • C++ 编写的移植版cpp_gunzip[8]
  • Go 编写的移植版go_gunzip[9]

尽量减少噪音

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

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

# 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

C1G28资讯网——每日最新资讯28at.com

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

基准测试

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

# 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

C1G28资讯网——每日最新资讯28at.com

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

C1G28资讯网——每日最新资讯28at.com

https://benchmarksgame-team.pages.debian.net/benchmarksgame/index.htmlC1G28资讯网——每日最新资讯28at.com

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

参考资料:C1G28资讯网——每日最新资讯28at.com

  • [1]Performance — C++ vs Rust vs Go: https://medium.com/@techhara/performance-c-vs-rust-vs-go-a44cbd2cc882
  • [2]GUN gzip: https://www.gnu.org/software/gzip
  • [3]zlib: https://www.zlib.net
  • [4]miniz: https://github.com/richgel999/miniz
  • [5]flate2-rx: https://github.com/rust-lang/flate2-rs
  • [6]gzip in Go: https://pkg.go.dev/compress/gzip
  • [7]gunzip in Rust: https://github.com/techhara/gunzip
  • [8]cpp_gunzip: https://github.com/TechHara/cpp_gunzip
  • [9]go_gunzip: https://github.com/TechHara/go_gunzip
  • [10]crc32fast: https://docs.rs/crc32fast/latest/crc32fast/
  • [11]FastCrc32: https://create.stephan-brumme.com/crc32
  • [12]crc32: https://pkg.go.dev/hash/crc32

本文链接:http://www.28at.com/showinfo-26-95918-0.htmlC++ vs Rust vs Go 性能比较

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: C++多线程中的互斥锁

下一篇: 程序的“通用性”和“过度设计”困境

标签:
  • 热门焦点
  • 印度登月最关键一步!月船三号今晚进入环月轨道

    8月5日消息,据印度官方消息,月船三号将于北京时间今晚21时30分左右开始近月制动进入环月轨道。这是该探测器能够成功的最关键步骤之一,如果成功将开始围
  • K8S | Service服务发现

    一、背景在微服务架构中,这里以开发环境「Dev」为基础来描述,在K8S集群中通常会开放:路由网关、注册中心、配置中心等相关服务,可以被集群外部访问;图片对于测试「Tes」环境或者
  • 如何使用JavaScript创建一只图像放大镜?

    译者 | 布加迪审校 | 重楼如果您曾经浏览过购物网站,可能遇到过图像放大功能。它可以让您放大图像的特定区域,以便浏览。结合这个小小的重要功能可以大大改善您网站的用户体验
  • 深度探索 Elasticsearch 8.X:function_score 参数解读与实战案例分析

    在 Elasticsearch 中,function_score 可以让我们在查询的同时对搜索结果进行自定义评分。function_score 提供了一系列的参数和函数让我们可以根据需求灵活地进行设置。近期
  • .NET 程序的 GDI 句柄泄露的再反思

    一、背景1. 讲故事上个月我写过一篇 如何洞察 C# 程序的 GDI 句柄泄露 文章,当时用的是 GDIView + WinDbg 把问题搞定,前者用来定位泄露资源,后者用来定位泄露代码,后面有朋友反
  • 每天一道面试题-CPU伪共享

    前言:了不起:又到了每天一到面试题的时候了!学弟,最近学习的怎么样啊 了不起学弟:最近学习的还不错,每天都在学习,每天都在进步! 了不起:那你最近学习的什么呢? 了不起学弟:最近在学习C
  • 阿里瓴羊One推出背后,零售企业迎数字化新解

    作者:刘旷近年来随着数字经济的高速发展,各式各样的SaaS应用服务更是层出不穷,但本质上SaaS大多局限于单一业务流层面,对用户核心关切的增长问题等则没有提供更好的解法。在Saa
  • 小米MIX Fold 3配置细节曝光:搭载领先版骁龙8 Gen2+罕见5倍长焦

    这段时间以来,包括三星、一加、荣耀等等有不少品牌旗下的最新折叠屏旗舰都得到了不少爆料,而小米新一代折叠屏旗舰——小米MIX Fold 3此前也屡屡被传
  • 与兆芯合作 联想推出全新旗舰版笔记本电脑开天N7系列

    联想与兆芯合作推出全新联想旗舰版笔记本电脑开天 N7系列。这个系列采用兆芯KX-6640MA处理器平台,KX-6640MA 处理器是采用了陆家嘴架构,16nm 工艺,4 核 4 线
Top