10
|
1 2008-02-06 Wataru MIYAGUNI <gongo@cr.ie.u-ryukyu.ac.jp>
|
|
2
|
|
3 * kernel/spe/*.cpp: new と placement new
|
|
4 現在、spe kernel のタスクは、切り替わる毎に
|
|
5 new/delete を繰り返しています。今はこれでいいんだけど、
|
|
6 速度的にも、いずれは直さないといけないと思うわけで。
|
|
7 で、予め allocate された領域を利用した placement new を使えば
|
|
8 new よりもそれなりに早くなるっぽい。
|
|
9 例題として、与えられた回数分 new/delete を繰り返すプログラムと、
|
|
10 同じ回数分、placement new したときの速度の比較
|
|
11
|
|
12 for (int i = 0; i < num; i++) {
|
|
13
|
|
14 < task = new Task;
|
|
15 < task->init(i);
|
|
16 < task->printID();
|
|
17 < delete task;
|
|
18 ---
|
|
19 > task = new(buff) Task; // buff = malloc(BUFF_SIZE);
|
|
20 > task->init(id);
|
|
21 > task->printID(id);
|
|
22 }
|
|
23
|
|
24 placement new では、delete の必要は無い。
|
|
25 その中で新たに allocate してるなら必要かもしれないが。
|
|
26 速度比較は以下。no_new が placement new で、ln_new が new/delete 。
|
|
27
|
|
28 % ./a.out 10 // 10 回
|
|
29 no_new: time: 0.012135(msec)
|
|
30 ln_new: time: 0.003572(msec)
|
|
31
|
|
32 % ./a.out 100
|
|
33 no_new: time: 0.022453(msec)
|
|
34 ln_new: time: 0.018989(msec)
|
|
35
|
|
36 % ./a.out 1000
|
|
37 no_new: time: 0.115277(msec)
|
|
38 ln_new: time: 0.136335(msec)
|
|
39
|
|
40 % ./a.out 10000
|
|
41 no_new: time: 1.056156(msec)
|
|
42 ln_new: time: 1.322709(msec)
|
|
43
|
|
44 % ./a.out 100000
|
|
45 no_new: time: 10.622221(msec)
|
|
46 ln_new: time: 13.362414(msec)
|
|
47
|
|
48 % ./a.out 1000000
|
|
49 no_new: time: 109.436496(msec)
|
|
50 ln_new: time: 136.956872(msec)
|
|
51
|
|
52 10、100 回だと負けてるが、まあ無視しよう(ぇ
|
|
53 回数が多くなるにつれて、ほんの少しだが no_new が勝ってる。
|
|
54 どうなんだろうね。ちなみに printID を無くすと
|
|
55
|
|
56 % ./a.out 1000000
|
|
57 no_new: time: 0.008512(msec)
|
|
58 ln_new: time: 27.100296(msec)
|
|
59
|
|
60 I/O に左右され過ぎ。まあそんなもんだろうけどさ。
|
|
61
|