Mercurial > hg > Members > kono > Cerium
diff TaskManager/Changelog @ 10:7aa4c006e4be
*** empty log message ***
author | gongo |
---|---|
date | Wed, 06 Feb 2008 18:31:30 +0900 |
parents | |
children | b658f8ca4408 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TaskManager/Changelog Wed Feb 06 18:31:30 2008 +0900 @@ -0,0 +1,61 @@ +2008-02-06 Wataru MIYAGUNI <gongo@cr.ie.u-ryukyu.ac.jp> + + * kernel/spe/*.cpp: new と placement new + 現在、spe kernel のタスクは、切り替わる毎に + new/delete を繰り返しています。今はこれでいいんだけど、 + 速度的にも、いずれは直さないといけないと思うわけで。 + で、予め allocate された領域を利用した placement new を使えば + new よりもそれなりに早くなるっぽい。 + 例題として、与えられた回数分 new/delete を繰り返すプログラムと、 + 同じ回数分、placement new したときの速度の比較 + + for (int i = 0; i < num; i++) { + + < task = new Task; + < task->init(i); + < task->printID(); + < delete task; + --- + > task = new(buff) Task; // buff = malloc(BUFF_SIZE); + > task->init(id); + > task->printID(id); + } + + placement new では、delete の必要は無い。 + その中で新たに allocate してるなら必要かもしれないが。 + 速度比較は以下。no_new が placement new で、ln_new が new/delete 。 + + % ./a.out 10 // 10 回 + no_new: time: 0.012135(msec) + ln_new: time: 0.003572(msec) + + % ./a.out 100 + no_new: time: 0.022453(msec) + ln_new: time: 0.018989(msec) + + % ./a.out 1000 + no_new: time: 0.115277(msec) + ln_new: time: 0.136335(msec) + + % ./a.out 10000 + no_new: time: 1.056156(msec) + ln_new: time: 1.322709(msec) + + % ./a.out 100000 + no_new: time: 10.622221(msec) + ln_new: time: 13.362414(msec) + + % ./a.out 1000000 + no_new: time: 109.436496(msec) + ln_new: time: 136.956872(msec) + + 10、100 回だと負けてるが、まあ無視しよう(ぇ + 回数が多くなるにつれて、ほんの少しだが no_new が勝ってる。 + どうなんだろうね。ちなみに printID を無くすと + + % ./a.out 1000000 + no_new: time: 0.008512(msec) + ln_new: time: 27.100296(msec) + + I/O に左右され過ぎ。まあそんなもんだろうけどさ。 +