testing - cargo test --release 导致堆栈溢出。为什么没有货台?

标签 testing stack rust benchmarking rust-cargo

在尝试编写优化的 DSP 算法时,我想知道堆栈分配和堆分配之间的相对速度,以及堆栈分配数组的大小限制。我意识到有堆栈帧大小限制,但我不明白为什么以下运行,使用 cargo bench 生成看似真实的基准测试结果,但在使用 cargo 运行时因堆栈溢出而失败测试 --release.

#![feature(test)]
extern crate test;

#[cfg(test)]
mod tests {
    use test::Bencher;

    #[bench]
    fn it_works(b: &mut Bencher) {
        b.iter(|| { let stack = [[[0.0; 2]; 512]; 512]; });
    }
}

最佳答案

为了让事情更直观,请注意数组的大小为 8 × 2 × 512 × 512 = 4 MiB。

cargo test 崩溃了,但是 cargo bench 没有崩溃,因为“测试”调用了函数 it_works() thread,而“bench”在主线程中调用它

主线程的默认堆栈大小通常为 8 MiB,因此该数组将占据可用堆栈的一半。这是很多,但仍有可用空间,因此基准测试正常运行。

stack size of a new thread但是,通常要小得多。在 Linux 上它是 2 MiB,and other platforms could be even smaller .因此,您的 4 MiB 数组很容易溢出线程的堆栈并导致堆栈溢出/段错误。

您可以将新线程的默认堆栈大小增加 setting the RUST_MIN_STACK environment variable .

$ RUST_MIN_STACK=8388608 cargo test 

cargo test 在并行线程中运行测试以缩短总测试时间,同时在同一线程中按顺序运行基准测试以减少噪音。

由于堆栈大小有限,在堆栈上分配这个数组不是一个好主意。您必须将它存储在堆上(box 它)或作为全局 static mut

关于testing - cargo test --release 导致堆栈溢出。为什么没有货台?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42955243/

相关文章:

c# - .net core 3.0,服务未使用 HostBuilder 注册以进行集成测试

java - Selenium - 错误 : Caught exception [ERROR: Unsupported command [clickAt]

c# - 使用 NUnit 作为可部署的测试套件

arrays - 如何创建和初始化不可变数组?

rust - 有没有一种方法可以在没有宏的情况下为 Rust 中的结构实现执行 var args ?

data-structures - 如何在安全的 Rust 中表达相互递归的数据结构?

sql - 对 SQL Server 执行计划进行基准测试以进行自动化测试?

c++ - 创建整数二维数组(与字符串二维数组相比)而不提及维度

c - 如何找到内核模块的当前堆栈使用情况以防止溢出?

python - 使用堆栈将字符串解析为树