回答編集履歴

3

flame graphの記事リンクが間違っていたため修正しました

2019/02/26 04:12

投稿

tatsuya6502
tatsuya6502

スコア2035

test CHANGED
@@ -148,7 +148,7 @@
148
148
 
149
149
 
150
150
 
151
- - [Rust Profiling with Instruments and FlameGraph on OSX: CPU/Time](http://carol-nichols.com/2015/12/09/rust-profiling-on-osx-cpu-time/)
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

軽微な修正

2019/02/26 04:12

投稿

tatsuya6502
tatsuya6502

スコア2035

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について追記しました

2019/02/26 04:06

投稿

tatsuya6502
tatsuya6502

スコア2035

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
+ ```