Rustのチュートリアルが完了してからツールを自作できるまで慣れました。
Pyo3の関係でcargo 1.34.0-nightlyを使用しています。
今はNightlyに付属しているベンチ機能を用いてオブジェクトのコスト把握を行っています。
以下のようなコードを用いてスタック領域のArrayとヒープ領域のArrayの速度差を調べようとしました。
しかしコンパイルには失敗します。
rust
1#![feature(test)] 2extern crate test; 3 4#[cfg(test)] 5mod tests { 6 use super::test::Bencher; 7 8 #[bench] 9 fn box_ref(b: &mut Bencher){ 10 let mut data = Box::new([0u8;32768*16]); 11 b.iter( move || {data.iter_mut().map(|x| *x += 1)}); 12 } 13 14 #[bench] 15 fn array_ref(b: &mut Bencher){ 16 let mut data = [0u8;32768*16]; 17 b.iter(move || data.iter_mut().map(|x| *x += 1)); 18 } 19}
そこで以下の様に変更し計測を行いました。
結果として、Boxが33,809 ns/iter (+/- 10,772)
、Arrayが11,342 ns/iter (+/- 509)
です。奇妙なのは data.iter_mut...
の行の数に依らず計測結果が変わりませんでした。アセンブラを確認しましたが最適化により削除されたのかよくわかりません。
rust
1#[cfg(test)] 2mod tests { 3 use super::test::Bencher; 4 5 #[bench] 6 fn box_ref(b: &mut Bencher){ 7 fn work() -> Box<[u8;32768*16]> { 8 let mut data = Box::new([0u8;32768*16]); 9 data.iter_mut().map(|x| *x += 1); 10 data 11 } 12 b.iter(|| work()); 13 } 14 15 #[bench] 16 fn array_ref(b: &mut Bencher){ 17 fn work() -> [u8;32768*16] { 18 let mut data = [0u8;32768*16]; 19 data.iter_mut().map(|x| *x += 1); 20 data 21 } 22 b.iter(|| work()); 23 } 24}
error
1error[E0495]: cannot infer an appropriate lifetime for autoref due to conflicting requirements 2 --> src\lib.rs:46:30 3 | 446 | b.iter(move || {data.iter_mut().map(|x| *x += 1)}); 5 | ^^^^^^^^ 6 | 7note: first, the lifetime cannot outlive the lifetime as defined on the body at 46:16...
iterの中にiterを含む事で予測できなくなるのか、原因がよくわからず困っています。
もしこの問題がわかる方がおられましたら、または二つの速度差についてわかる方がおられましたら、
回答の方を宜しくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/02/27 11:51
2019/02/27 12:08