9得票3回答
在Rust语言中,哪些整数操作有更高性能的替代方法?

在Rust中编写整数函数时(例如像素处理),使用性能最高的操作很有用,类似于C/C++。虽然参考手册解释了行为的更改,但并不总是清楚哪些方法比标准整数算术运算更高效。(请参见注1)我认为wrapping_add编译后等同于C语言的加法。在标准操作(加/减/乘/取模/除/移位/位操作...)中,...

7得票1回答
为什么在这段 Rust 代码中没有分支预测失败惩罚?

我编写了这个非常简单的 Rust 函数: fn iterate(nums: &Box<[i32]>) -> i32 { let mut total = 0; let len = nums.len(); for i in 0..len { ...

259得票2回答
为什么循环遍历一个有240个或更多元素的数组会对性能产生巨大影响?

在 Rust 中对数组运行求和循环时,我注意到当 CAPACITY >= 240 时性能急剧下降。大约以 CAPACITY = 239 的速度快了80倍。 是否有 Rust 对“短”数组进行的特殊编译优化? 使用rustc -C opt-level=3编译。use std::time::I...

26得票1回答
有没有一种方法可以使Rust将指针视为非别名,以便它可以将它们标记为LLVM优化器的“noalias”?

以下是指针别名的示例:pub unsafe fn f(a: *mut i32, b: *mut i32, x: *const i32) { *a = *x; *b = *x; } 经过 -C opt-level=s 编译,会生成以下汇编代码:example::f: pu...

12得票1回答
为什么使用-O0选项(针对这个简单的浮点数求和)时,clang生成效率低下的汇编代码?

我正在使用 llvm clang Apple LLVM 版本 8.0.0 (clang-800.0.42.1) 对这段代码进行反汇编: Translated text: Using llvm clang Apple LLVM version 8.0.0 (clang-800.0.42.1),...

15得票2回答
LLVM opt mem2reg没有效果

我目前在研究LLVM,并尝试编写一些优化器,以便熟悉opt和clang。我编写了一个名为test.c的文件,内容如下:int foo(int aa, int bb, int cc){ int sum = aa + bb; return sum/cc; } 我编译了源代码并生成了...

571得票6回答
C++标准允许未初始化的布尔值导致程序崩溃吗?

我知道在C++中的{{未定义行为}}可以让编译器做任何它想做的事情。然而,我遇到了一个崩溃问题,这让我感到惊讶,因为我认为代码足够安全。 在这种情况下,真正的问题只发生在使用特定编译器的特定平台上,并且仅在启用优化时才会出现。 我尝试了几种方法来复制问题并将其简化到最大程度。这里有一个名为...

29得票1回答
为什么当我移除边界检查时,我的代码运行速度变慢了?

我正在使用Rust编写线性代数库。 我有一个函数,可以获取给定行和列的矩阵单元格的引用。此函数以一对断言开始,用于检查行和列是否在范围内: #[inline(always)] pub fn get(&self, row: usize, col: usize) -> &...

10得票1回答
为什么Rust编译器不能优化掉Box::downcast的Err分支?

我有一个 Box<dyn Any>,并且我知道其中的基础类型,因此我想优化掉Box::downcast()中的测试(源代码)。 首先我尝试使用 std::hint::unreachable_unchecked():pub unsafe fn downcast() -> B...

132得票1回答
何时应该在Rust中使用inline?

Rust有一个"inline"属性,可以使用以下三种方式之一: #[inline] #[inline(always)] #[inline(never)] 何时应该使用它们? 在Rust参考文献中,我们看到一个内联属性部分的说明: 编译器根据内部启发式方法自动内联函数。错误地内联函...