「SO问答」既然两个可变引用不能别名为啥Rust编译器没有对其进行优化
该问题的作者描述,比如C代码中:
void adds(int *a, int *b) {
*a += *b;
*a += *b;
}
两个指针a和b有可能互为别名(俩指针指向同一数据),所以clang在编译该代码的时候,会在寄存器中存储两次(%rsi),%eax
来防止这种情况。当然也可以使用restrict关键字来对参数进行约束,显式地告诉编译器这俩指针不可能互为别名(但在C语言中,restrict关键字仅仅是告诉编译器可以优化,它不会帮助开发者进行检查,也就是说,很可能因为开发者没有遵循此契约而引发未定义行为)。从而生成的优化代码中只存储一次寄存器。
但是作者发现在Rust中虽然有编译器检查,两个可变引用不存在互为别名的情况,但是编译器并没有因此而进行任何优化:
#![crate_type = "staticlib"]
#[no_mangle]
fn adds(a: &mut i32, b: &mut i32) {
*a += *b;
*a += *b;
}
所以他比较担忧,是不是在Safe Rust之下也可能存在别名?
该贴的回复给出了答案:
Rust最初启用了LLVM的noalias属性,但这导致了非预期的编译结果(算是LLVM的一个Bug,等issues 54878修复以后就正常了)。现在也可以使用-Zmutable-noalias=yes
参数进行编译就能得到预期结果。
「学术」使用类型化指针反转进行高效析构
HAL INRIA貌似是法国国家信息及自动化研究院。该论文提出了ML风格编程语言的资源管理模型,旨在兼容OCmal理念和运行时模型,提议使用析构函数扩展OCmal,在系统编程所有权和借用模式之上来提升OCmal的安全性、效率。
没错,借用了Rust/C++中的一些概念。感兴趣的可以看看,对资源管理应该会有深入的了解。
该组织已经发布了多篇关于Rust研究的论文了。
Python和Rust实现神经网络
这篇文章是作者探索Rust是否适合数据科学的工作。他分别用python和rust实现了一个小型的神经网络,然后进行了性能测试,利用火焰图进行分析,最终得出一个结论:
- 大部分时间都花在做线性代数上,不管Rust还是Python,所以使用Rust永远也不会有10倍的加速。
- Python进行优化以后,性能可以提升两倍,Rust原则上可以进行相同的优化,但目前ndarray还不支持2维数据以上的矩阵乘法。
- 作者认为,Rust目前还没有做好胜任数据科学的工作。未来还需要更完善的生态系统。
关于Rust依赖安全的最新思考
很高兴有人在帮我们思考这个问题:当一个crate依赖越来越多的crates时,我们有什么办法可以审计它们?
paperclip: OpenAPI的代码生成工具
0.3发布,支持OpenAPI V2接口。
rocket-lamb: 方便在aws lambda上面跑rocket的库
async-injector: Rust的异步反应式依赖注入库
新库,WIP状态。该库是从作者的另外一个项目OxidizeBot(高性能Twitch机器人)中提取出来的。
「讨论」Rust如何实现代数效应
看样子该贴作者是一个函数式粉丝。评论回复中有人用Rust实现了一个代数效应库effective-rust。
代数效应目前是一个学术/实验概念,它允许你通过使用类似于throw catch的机制来改变称为“效果”的某些计算元素(如函数调用,打印语句等)。
Debian Buster 将会预装Rust编译器
2019年7月6日发布的Debian GNU/Linux 10 “Buster” 操作系统将预装Rust编译器。
From 日报小组 Chaos
日报订阅地址:
独立日报订阅地址:
社区学习交流平台订阅: