135-1821-9792

rust语言还没go快 rust语言 没前景

rust/warp 比 go/fasthttp 要快数倍

上周我发现了关于超性能的帖子。它表示 rust tokio/hyper 性能高于 go http。这是意料之中的,但有一条评论与 fasthttp 相比,其中 rust 的表现稍差。

我们提供的服务有:网站设计、成都网站设计、微信公众号开发、网站优化、网站认证、墨脱ssl等。为上千企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的墨脱网站制作公司

我决定自己执行基准测试。使用以下命令在 AWS r5n.8xlarge实例上执行所有基准测试:

go/fasthttp 代码:

生锈/扭曲代码:

请注意,需要额外的标头来匹配 fasthttp 实现。

初始基准测试结果

去/快速http:

生锈/翘曲:

fasthttp 比 rust 版本高出 10% 左右!

优化 rust 版本

很少有已知的技巧可以使 rust 版本更好地工作。让我们一步一步地应用它们,看看我们能走多远。

启用 LTO

LTO 是一种链接时优化,可减少生成的二进制大小并提高性能。了解有关 LTO 的更多信息。

与初始版本相比,我们获得了 +5% 的收益。

使用 Jemalloc

默认情况下,rust 代码使用 libc 内存分配器,通常不建议将其用于高负载的关键应用程序。有很多替代分配器。根据我的经验,jemalloc 在性能和内存利用率方面是最好的。了解有关使用 jemalloc 的更多信息。

与 LTO 版本相比,我们得到了 +1.8%。

启用不稳定的管道

带有wrk 的Benchmark是一个非常简单的 HTTP/1 小明文测试。这种基准有一些细节。让我们unstable_pipeline在 warp 实例上启用。

与 LTO+jemalloc 版本相比,我们获得了额外的 +3.8%。

太好了,在这一步我们已经超越了 fasthttp!

修复一些 tokio

让我们检查一下火焰图,看看运行代码是否有明显的无效性。我不会发布它,以免叙述过多。

引起我注意的特殊功能是wake0 (见这里)。

该wakers数组是在每个函数调用上创建的,用于收集所有需要通知并实际通知它们的唤醒者。我开始使用这段代码,并意识到减少会NUM_WAKERS提高性能!让我们在这里注意,它是一个数组(不是 vec),它是在堆栈上分配的,所以不会发生分配。性能不足的原因是rust在初始化数组时,会将None值复制到数组的每个槽中。NUM_WAKERS当增加时,这会导致减速。

我们获得了额外的 +2.8%,并且以 3.7% 的成绩超过了 go/fasthttp!

什么做得不好

我尝试了更多技巧,但没有显示出有意义的影响:

Rust 和 Go,哪个性能更好?

要说性能,那是Rust更好。更多的编译期优化、无 GC 等特点加持,开发高性能应用自然是 Rust 性能高。据统计利用 Rust 开发的 RipGrep 性能甚至赛过使用 C 开发的 Grep。

但是性能不是唯一考量,当你纠结 Borrow Check,纠结 unsafe,纠结 copy clone,纠结各种奇怪的类型限制的时候;当你 cargo build 怒草电脑风扇三分钟的时候;人家 GoLang 可能早就发两个版了。

同时 Rust 的语法花活众多,遍历数组可以写循环也可以 for_each() 一行流。不像 GoLang 那么白开水谁写都差不多一个味道,经常第一天想到神来之笔快乐 Coding 到半夜第二天爬起来发现昨晚写的都甚么东西看不懂不如蜘蛛爬,这是坠痛苦的!

Go 的编译器为了个编译速度快连循环不变式提升、循环展开、对齐等等优化一个都不做,函数内敛一堆限制大多数情况都不做(比如函数里有个 for 或者 defer 或者 select 等,或者函数多于 40 个表达式),拥有的优化一只手都能数的过来:

基础优化欠缺,高级优化更是一个没有,和在 Debug 配置编译下的 -O0 优化的 C++ 差不多一个概念(而且跑得更慢),哪来的资本和 rust 比性能。

其他方面:

而且 Go 的 GC 吞吐量也很低,大多数情况下各方面 Go 跑的甚至都比 Java 更慢。只不过得益于 AOT 编译的设计,相比 Java 而言除了内存占用小和启动速度快之外就没有任何优势了,比较适合拿来做性能不关键的命令行工具。

个人还是更喜欢 Rust。

对比 Go 语言,Rust 有什么优势和劣势?

我并没有什么编程的经验,觉得编程实在是太复杂了,不喜欢去研究太多,对这个也不怎么懂,只能说自己是个半吊子,就是所掌握的知识,也是东拼西凑的,朋友和我说点儿,自己去书上看一点儿,只能说根据自己的体验给出一些体会吧。

Rust的优势是:

1、Rust把安全、精确的内存管理作为一切的中心放在首要的位置。

2、Rust同时拥有特别强的控制性和特别强的安全性。

3、Rust语言通过: 优秀的类型系统设计、 严格的编译器静态审查、 配合程序员局部核对、加上少量的运行时校验,保障了内存安全。

4、Rust的语言特别的复杂,导致学习曲线比较陡峭,对于初学者来说难度较大。但学通之后将终生受益。

5、效率高,速度特别的快

6、 支持范型

7、 社区活跃度很高,更加的强调了社区的作用。

8、Rust 有更强的语义,更容易捕获错误的逻辑,编译器直接检查出你代码中的不安全的部分

Rust的劣势是:

1、 语言相对来说比较复杂,对于新手来说,让新手摸不着头脑。

2、还不算太稳定。

其实我觉得什么代码啊编程啊这些东西还是比较适合理工的学生去研究,我一看脑袋就大,完全不明白在讲什么。我大概了解的就是这些,语言的话大家可以多方面的去了解,也不是说有缺点就是不好,看配置看个人吧,每个人习惯不一样,也许有的人用不稳定的还觉得挺好呢,有的人就喜欢比较完美的,在我看来编程这个东西真的是很复杂,会有很多的代码,这些代码弄得我自己头都大了,有的时候还得去恶补一下。


网站名称:rust语言还没go快 rust语言 没前景
网页地址:http://kswsj.com/article/ddgdjhe.html

其他资讯



Copyright © 2009-2022 www.kswsj.com 成都快上网科技有限公司 版权所有 蜀ICP备19037934号