大牛最新研究!提速Rust编译器!( 二 )


大牛最新研究!提速Rust编译器!

文章插图
这种转换对Rust众多语法糖进行了脱糖 , 并且极大精简了Rust的语法(但并非其语法子集) , 是观察和分析Rust代码的常用手段 , 尤其是在控制流图和借用检查等方面 。
在这篇文章的最后 ,  Nethercote提供了几个数据集的链接 , 每个数据集都记录了编译rust -performance基准时每个CGU的测量值 。这些数据集包括许多测量静态代码大小的输入(独立变量) , 例如 , 函数数量和MIR数量等 。
Nethercote试着用scikit-learn做一些基本的分析 。并且 , 通过这些基本的分析 , 能让 Nethercote仔细推敲到底应该搜集哪些测量值 。
通过一系列的改进优化 , 他获得的最终数据集比刚开始时的数据更准确 。但是 , 并没有通过这些数据获得多少实际的结果 。实际上 , 每次我对测量的内容改变后都会得到完全不同的结果 。
实现更快的Lexer
词法分析(lexical analysis)是编译器的第一个阶段 , 实现词法分析的代码称为lexer 。
有人最近研究了logos(https://Github.com/maciejhirsz/logos)这个在rust中广受欢迎的lexer 。
此前 , logos声称其目标是能比手动实现的lexer更快 , 作者提出了质疑 , 因为在他看来 , 通用性和性能无法兼得 。因此 , 他一步步实现了lexer , 探索了多种优化技巧 , 并与logos进行了多轮性能对比 。
最终的结果表明 , 手动实现的基于状态机的lexer比logos实现了20%左右的性能提升 。
从错误中学习:使用Rust实现DLL注入Rust是一种注重安全性的编程语言 , 但在某些情况下 , 开发人员可能需要使用 unsafe关键字来执行某些操作 。
unsafe可以提供更高的性能 , 但可能会牺牲安全性 。因此 , 开发人员在使用时需要非常小心 。
几个使用 unsafe的常见场景包括:访问裸指针、调用外部C函数等 , 并提供了一些建议和最佳实践 , 以确保在使用 unsafe时不会引入潜在的安全隐患 。
举个应用方面的例子:原来 , 作者一直在用C++编写逆向工具 , 但是 , C++这门语言并不友好 , 于是研究了下如何使用Rust实现DLL注入的“工具” 。
大致原理就是让Rust首先生成一个C样式的DLL , 然后 , 使用 unsafe操作裸指针 , 操作程序内存 , 最后实现DLL注入就可以了 。
期待更准确的估计函数
Nethercote 希望具有数据分析专业知识的人可以做得更好 ,  重点关注以下几个方面:
1.更匹配的估计函数
2.想要使编译器比现在更快 , 一个更好的估计函数也许不会达到预期的效果 。我提出了一些更好的统计方法 , 但并没有提升编译速度 , 甚至变差 。
3.CGU调度效果不可预测 , 你不能假设一个估计函数好几个百分点就会使编译器更快 。话虽如此 , 我希望改进力度足够大 , 能够转化为实际的加速 。
4.对于估计函数来说 , 最好高估CGU编译所需的时间 , 而不是低估 。
5.我很担心过度拟合 。数据集来自一台机器 , 但实际上 , rustc会运行在不同的机器上 , 具有各种各样的体系结构和微体系结构 。
6.这些数据集来自单一版本的rustc , 使用单一版本的LLVM 。我担心随着时间的推移准确性可能会漂移 。
7.我更喜欢不太复杂且易于理解的估计函数 。当前的函数非常简单 , 在大多数情况下只是增加了基本模块和语句的数量 。例如:0大小的CGU应该别估计为花费非常接近于0的时间 。
8.估计函数有一个明确的问题 , 即如果不考虑其内部公式 , 计算MIR语句可能非常不准确 。特别是 , 单个MIR语句可能变得很长 。举个例子:深度向量压力测试的MIR包含一条语句 , 该语句定义了包含超过100 , 000个元素的向量字面量 。不出所料 , 当前的估计函数严重低估了编译这个基准所需的时间 。
Nethercote最后提醒: 希望以上的请求是合理的!
以下是上文提到的数据集:
•调试构建 , 主要基准测试
https://nnethercote.github.io/aux/2023/07/25/Debug-Primary.txt


推荐阅读