回答編集履歴
3
flame graphの記事リンクが間違っていたため修正しました
test
CHANGED
@@ -148,7 +148,7 @@
|
|
148
148
|
|
149
149
|
|
150
150
|
|
151
|
-
- [Rust Profiling with
|
151
|
+
- [Rust Profiling with DTrace and FlameGraph on OSX](http://carol-nichols.com/2017/04/20/rust-profiling-with-dtrace-on-osx/)
|
152
152
|
|
153
153
|
|
154
154
|
|
2
軽微な修正
test
CHANGED
@@ -162,7 +162,7 @@
|
|
162
162
|
|
163
163
|
|
164
164
|
|
165
|
-
書き忘れましたが、`Box::new([0u8;32768*16])`のように**固定長**(サイズが固定)の配列をヒープに置くようなことは普通はしません。スタックに置くのと違って、ヒープに置くときは実行時にサイズを決められますので、このような用途にはベクタ(`Vec<T>`)を使います。
|
165
|
+
書き忘れましたが、`Box::new([0u8;32768*16])`のように**固定長**(サイズが固定)の配列をヒープに置くようなことは普通はしません。スタックに置くのと違って、ヒープに置くときは実行時にサイズを決められますので、このような用途には**可変長**のベクタ(`Vec<T>`)を使います。
|
166
166
|
|
167
167
|
|
168
168
|
|
1
Vecとboxed sliceについて追記しました
test
CHANGED
@@ -153,3 +153,65 @@
|
|
153
153
|
|
154
154
|
|
155
155
|
Linuxだとdtraceの代わりにperfが使えたと思います。(私はメインのマシンがFreeBSDとmacOSなのでdtraceしか使っておらず、perfのことはよくわかりません。またWindowsでどうするかもわかりません)
|
156
|
+
|
157
|
+
|
158
|
+
|
159
|
+
---
|
160
|
+
|
161
|
+
**追記**
|
162
|
+
|
163
|
+
|
164
|
+
|
165
|
+
書き忘れましたが、`Box::new([0u8;32768*16])`のように**固定長**(サイズが固定)の配列をヒープに置くようなことは普通はしません。スタックに置くのと違って、ヒープに置くときは実行時にサイズを決められますので、このような用途にはベクタ(`Vec<T>`)を使います。
|
166
|
+
|
167
|
+
|
168
|
+
|
169
|
+
`Box::new([0u8;32768*16])`とすると、まずスタック上の配列が初期化され、それが`Box::new`によってヒープにコピーされますので非効率な処理になります(上のベンチマークではその部分にかかる時間は測定の範囲外になっています) `Vec<T>`なら最初からヒープ領域が初期化されます。
|
170
|
+
|
171
|
+
|
172
|
+
|
173
|
+
あと`Vec<T>`の`push`や`pop`はいらないけれどヒープに置きたいというときは、boxed slice(`Box<[T]>`)というものもあります。これは`Vec<T>`から変換して作ります。
|
174
|
+
|
175
|
+
|
176
|
+
|
177
|
+
```rust
|
178
|
+
|
179
|
+
#[bench]
|
180
|
+
|
181
|
+
// Vec<T>
|
182
|
+
|
183
|
+
fn vec(b: &mut Bencher) {
|
184
|
+
|
185
|
+
let mut data = vec![0u8;32768*16];
|
186
|
+
|
187
|
+
b.iter(move || {
|
188
|
+
|
189
|
+
data.iter_mut().for_each(|x| *x += 1);
|
190
|
+
|
191
|
+
// data.iter_mut().for_each(|x| *x += 1);
|
192
|
+
|
193
|
+
});
|
194
|
+
|
195
|
+
}
|
196
|
+
|
197
|
+
|
198
|
+
|
199
|
+
#[bench]
|
200
|
+
|
201
|
+
// Box<[T]>
|
202
|
+
|
203
|
+
fn boxed_slice(b: &mut Bencher) {
|
204
|
+
|
205
|
+
let mut data = vec![0u8;32768*16].into_boxed_slice(); // Box<[u8]>型
|
206
|
+
|
207
|
+
b.iter(move || {
|
208
|
+
|
209
|
+
data.iter_mut().for_each(|x| *x += 1);
|
210
|
+
|
211
|
+
// data.iter_mut().for_each(|x| *x += 1);
|
212
|
+
|
213
|
+
});
|
214
|
+
|
215
|
+
}
|
216
|
+
|
217
|
+
```
|