簡體   English   中英

貨物測試-釋放導致堆棧溢出。 為什么沒有貨台?

[英]cargo test --release causes a stack overflow. Why doesn't cargo bench?

在嘗試編寫優化的DSP算法時,我想知道堆棧分配和堆分配之間的相對速度以及堆棧分配數組的大小限制。 我意識到有一個堆棧框架大小限制,但是我不明白為什么要運行以下程序,從而在cargo bench產生看似真實的基准測試結果,但是在進行cargo test --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 test cargo bench沒有崩潰,因為“測試” 在新線程中調用了函數it_works() ,而“長凳” 在主線程中調用了該函數。

主線程的默認堆棧大小通常為8 MiB,因此該陣列將占據可用堆棧的一半。 足夠多了,但仍有可用空間,因此基准測試正常運行。

但是, 新線程堆棧大小通常要小得多。 在Linux上是2 MiB, 其他平台可能更小 因此,您的4 MiB陣列很容易溢出線程的堆棧,並導致堆棧溢出/ segfault。

您可以通過設置RUST_MIN_STACK環境變量來增加新線程的默認堆棧大小。

$ RUST_MIN_STACK=8388608 cargo test 

cargo test測試在並行線程中運行測試以縮短總測試時間,而基准測試則在同一線程中依次運行以減少噪音。

由於堆棧大小有限,在堆棧上分配此數組是一個壞主意。 您必須將其存儲在堆上( box )或作為全局static mut

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM