最近在做framework DSW的代码,正在写容器的类库,好不容易写完TList(上面还有一大堆的接口和抽象类~~),结果发现作为SplFixedArray的大Wrapper的TList居然性能上输给了普通数组……晕啊,不过后来才发现……原来……
下面是测试代码:
function test1() {
$i=10000;
$obj=new TList(10); //这个是我自己的类,一开始给10个元素,不够会自动扩充的,也就是说我的不是Fixed容量的,呵呵
while ($i--) {
$obj->Add('10');
}
}
function test2() {
$i=10000;
while ($i--) {
$arr[]='10';
}
}
function test3(){
$i=10000;
$spl=new SplFixedArray(10000);
while ($i--) {
$spl[$i]='10';
}
}
function test4() {
$i=10000;
$spl=new SplFixedArray(10000);
while ($i--) {
$spl->offsetSet($i, '10');
}
}
test1();
test2();
test3();
test4();
测试环境:Windows 7(7260)、PHP 5.3RC1 CGI、Zend Studio7(Build ID 20090805的试用版)内置的PHP Profile、Intel T7100@1.8GHz、3G DDR2
测试结果(点击看大图):
呵呵,其实,只有像数组那样使用SplFixedArray才会快,就是要像test3()那样,用“[]”,而不是SqlFixedArray::offsetSet(),那样只有慢,我TList就是没有用“[]”,导致速度慢。