写点什么

高效又节能的 Rust 能帮助拯救地球吗?

  • 2022-02-17
  • 本文字数:2467 字

    阅读完需:约 8 分钟

高效又节能的Rust能帮助拯救地球吗?

这种编程语言安全又高效,但很难学,会拖累生产力。


去年 12 月,在 AWS Re:invent 大会上,Rust 基金会主席 Shane Miller 和 Tokio 项目负责人 Carl Lerche 提出了使用 Rust 来尽可能减小人类对环境破坏的概念,但他们认为 Rust 陡峭的学习曲线是通向这一目标的道路上最大的障碍。


Miller 还是 AWS 的高级工程经理,而 Lerche 是这家云巨头的首席工程师。


Rust 为什么能拯救地球呢?答案是,更高效的代码需要的运行资源也会更少,这意味着数据中心消耗的能源会更少,而且制造计算设备并将其运送到世界各地的过程中对环境的影响也会更低。



Shane Miller 和 Carl Lerche 在 AWS Re:invent 2021 上谈论 Rust 的效率和安全性


“数据中心消耗了……全球能源总量的 1%,”Miller 说道。不过他补充说,由于技术进步以及云计算行业倾向于减少闲置资源的比例等因素,过去 10 年来行业消耗的能源总量几乎没有变化。


他们论点的第二部分是说 Rust 是最高效的编程语言之一。他们引用的证据来源是 2017 年的一篇论文[PDF],这篇论文测量了 27 种编程语言的性能、内存使用量和能源效率,并将 C 列为最高效的语言,而 Rust 紧随其后,能源使用量仅比 C 增加了 3%。根据这项研究,Java 使用的能量几乎是 C 的两倍,C#则是 C 的三倍以上,Python 则需要使用 75 倍以上的能量。



根据 2017 年的一项研究项目,按能源效率排名的语言

高效率的 Rust 语言


这项研究是有问题的,正如这次会议上的一些人所观察到的那样:之所以会产生这样的结果,不是因为有些语言不那么关心能源效率,而是因为编程语言有许多实现和编译器,其中一些是相对更高效的。这篇论文还测出来 TypeScript 的效率只有 JavaScript 的十分之一,这也很奇怪,因为它明明可以编译为 JavaScript,并且两种语言编写的代码差不多。


不过这些问题并没有那么重要,因为没有人质疑 Rust 作为一种系统语言的效率的确极为出色这个结论。 而且 Miller 和 Lerche 的论点并不仅仅依赖于这项研究。Miller 还引用了来自 Discord 和 Tenable 的案例研究,这些研究显示了 Rust 带来的显著效率提升。


在 Tenable 案例中,开发人员用 Rust 重写了一个 JavaScript 组件,并实现了 50%的延迟改进、75%的 CPU 使用率下降和 95%的内存使用率下降。“这真是不可思议,”Miller 说。“这可节约了不是一点半点,而且不仅仅是在基础设施方面节省了资源,它还意味着节约大量能源。”


Lerche 说,垃圾收集语言本质上就是效率较低的。垃圾收集是自动化内存管理工作的常用方法,它的机制是识别超出范围的对象并释放它们的内存。


“垃圾收集器必须暂停进程以执行垃圾收集操作。当它暂停时……该服务无法再响应请求,”他说。这意味着 Java、C#和 JavaScript 等语言永远无法像 C 和 Rust 那样兼具高效率和高性能。


为什么不直接使用 C 和 C++呢?原因在于安全性和与内存相关的错误上,Lerche 说,他还引用了一项研究,“C 和 C++软件中所有高度严重的安全漏洞中有 70%是由于[缺乏]内存安全性。”


他说,Rust 是革命性的,因为“Rust 是第一种在保持内存安全性的同时具备高效率的主流编程语言。”Lerche 解释了 Rust 如何通过所有权(ownership)的理念来实现内存安全性,这种理念基于一个称为仿射逻辑的概念,其中每个对象一次只有一个所有者(owner)。


所有权规则会在编译时检查,因此没有运行时开销。并发在 Rust 中也比在 C 或 C++中更容易实现、更安全,从而进一步提升了性能和效率。


看起来这个目标很容易达成。开发人员和 IT 社区需要做的就是迁移到 Rust 即可,代码将运行得更快、更安全,地球的能源使用量会随之下降,AWS 可以关闭他们一半的数据中心(尽管我们在会议期间没有听到最后这句话)。

Rust 很节能,但太难学导致流行不起来

“但是,”Miller 说,“如果我们要实现碳减排目标……我们将需要使用 C 或 Rust 等节能语言编写大多数新软件。但是 Rust 确实有一个“臭名昭著”的学习曲线……我们看到了不少人在采用它,但我们并没有看到它广泛流行开来。


“我看到 Rust 使用率增长最快的场景是通过使用 Rust 可以获得显著性能提升的场景,例如大容量的数据库服务等等;在物联网和嵌入式等资源受限的小型环境中也有很多人用 Rust。但在类似这样的场景里:你正在写一个 JavaScript 应用的后端——我们是很难看到类似的采用率的。”


问题是在 Rust 中编程是很困难的。Java、JavaScript 和 Python 等语言被广泛采用的原因之一是程序员可以更快地提高他们的工作效率。


这就是房间里的大象,“著名的学习曲线,”Miller 说。在最近的一项调查中,“在表示不再使用该语言的工程师中,55%的受访者将学习和生产力列为放弃该语言的原因。经验丰富的工程师需要在主题专家的支持下进行三到六个月的学习,然后才能使用该语言进行高效工作。”


有没有可能抚平学习曲线呢?“学习曲线的部分问题并不是说语言有多难用,而是开发体验存在不足,因此我们看到来自 Java 等语言并尝试使用 Rust 的工程师们说,他们对调试器的体验感到不舒服,”Miller 在回答我们的问题时说。“Rust 的性能分析工具与他们习惯使用的也不一样。这就是我们正在调查的领域。”


“从历史上看,Rust 是作为 C++的替代品出现的,”Lerche 补充道。“它的目标就是那个用例。但是我们发现在更高层次上还有很多应用场景。


“如果你要构建一个服务,你得先看一遍 Rust 写得非常详细的手册,然后了解生命周期、trait 和 trait 模式,以及所有这些属于这种语言一部分的概念,但这些概念和你要编写的服务基本没什么关系。”他说,Rust 项目有计划编写一套简化的文档,其中只包含一些“编写服务所需的知识”。


尽管这些举措会有所帮助,但很难想象 Rust 真的会变得那么简单易用,简单到足够让业务应用程序的开发人员能从 Java 或 JavaScript,或 C#或 Python 切换过来。毕竟他们还是有很多业务问题需要解决,并且用其他那些语言来搞定会快得多。


进一步说,在计算栈的底层,代码可能会是用 Rust 或 C 或 C++编写的,因为对于 Linux 内核或数据库引擎的核心来说,高性能和效率已经是一项要求了。


也就是说,Rust 要发挥作用的关键在于目标环境的软件低效率已经显著增加了客户成本,并且 IT 行业非常关注这种低效率问题才行,而且 Rust 也只是解决低效率问题的一部分手段而已。


原文链接:https://www.theregister.com/2021/11/30/aws_reinvent_rust

2022-02-17 09:304348
用户头像
刘燕 InfoQ高级技术编辑

发布了 1112 篇内容, 共 583.8 次阅读, 收获喜欢 1981 次。

关注

评论 1 条评论

发布
用户头像
这……这感觉是在说一个不需要额外说明的道理啊。rust的目标是干死C++,而不是针对java。应该说rust是c++的安全替代,而不是说rust无所不能。同时通过pyo3等项目,rust可以用来在特定情况下显著优化python之类高级语言写的程序的性能。反正就是当优化执行性能本身已经有规模效益时,原来用c/c++来进行的优化,现在有了个安全的多的替代方案
2022-02-17 16:51
回复
没有更多了
发现更多内容

【摘】Git-从零单排 01期

卡尔

git 效率工具 工具 开发工具

JAVA AGENT 学习

zane

Java

OpenResty 部署配置和日志切割

wong

centos log openresty

MySQL查询优化一般步骤

Albert

MySQL sql 查询优化

团队快速扩张时期的组织架构演进

小鲸数据

团队管理 团队协作 团队 团队组织

《零基础学 Java》 FAQ 之 13-编程里的两个特殊的值

臧萌

Java

Git内部原理介绍

戈坞昂

git

程序员如何阅读英文资料

码上生长

学习

专业的力量

无量靠谱

淘宝 美团 专业 专业主义 大前研一

唯技术论坏处都有啥?如何跳出唯技术论思维?

KAMI

方法论 思考 思维方式 开发 唯技术论

介绍一款文本分析工具

黄大路

数据挖掘 数据分析 nlp

机器学习-有监督学习入门

第519区

学习 产品经理

听过很多道理,依然过不好这一生。

Neco.W

感悟 创业心态

全栈工程师为什么越混越困难,看这篇就够了

金刚小书童

程序员 职业规划 技术管理 全栈工程师

mac 安装特定版本php-redis

Albert

php

RestTemplate 配置手册

zane

Spring Boot HTTP

使用docker-compose部署单机RabbitMQ

Kevin Liao

Docker Docker-compose RabbitMQ

《零基础学 Java》 FAQ 之 15-Java泛型做了两件事

臧萌

Java

《零基础学 Java》 FAQ 之 16-泛型引用的通配符再解

臧萌

Java

简单聊聊什么是苹果生态

李俊辰

1分钟学习Java中数组快速复制

Albert

Java 数组

Android实现人脸识别(人脸检测)初识

sar

android OpenCV renlianshibie

李想解读《高效能人士的七个习惯》

我心依然

习惯 高效能人士的七个习惯 李想 汽车之家

浅谈使命、愿景、价值观。

石云升

价值观 使命 愿景

"第1天,读以太坊白皮书 | 5天掌握以太坊 dApp 开发"

陈东泽 EuryChen

区块链 以太坊 dapp Ethereum blockchain

ARTS - 第一周打卡

陈文昕

记:mybatis <foreach> 语法错误

Kevin Liao

mybatis foreach SQL语法 SQLSyntaxErrorException

IO多路复用整理

戈坞昂

Linux io

《零基础学 Java》 FAQ 之 14-访问控制符总结

臧萌

Java

工厂模式(二)MyBatis中展示的简单的工厂模式

LSJ

mybatis 工厂模式

重磅!Apache Flink 1.11 功能前瞻抢先看!

Apache Flink

大数据 flink 流计算 实时计算

高效又节能的Rust能帮助拯救地球吗?_AI&大模型_Tim Anderson_InfoQ精选文章