[PHP-users 10925] Re: 配列を走査するには
Moriyoshi Koizumi
php-users@php.gr.jp
Thu, 17 Oct 2002 17:34:32 +0900
小泉です。
先ほど書いたベンチマークのコードです。
不備があるかもしれません。
----------------
結果@Duron 1Ghz
test1: 0.772366
test2: 0.580486
test3: 0.844222
----------------
<?php
function timediff( $ts, $te ) {
list( $ts_usec, $ts_sec ) = explode( ' ', $ts );
list( $te_usec, $te_sec ) = explode( ' ', $te );
return ((float)$te_usec - (float)$ts_usec) + (float)( (int)$te_sec - (int)$ts_sec );
}
function mycbfunc( &$item ) {
$item = addslashes( $item );
}
for($i=0; $i<100000; ++$i) {
$ary_org[$i] = str_repeat( "\\", rand( 0, 12 ) ).sprintf( "%08x", rand(-1,0x7fffffff) );
}
function test1( &$ary ) {
$ts = microtime();
for (reset($ary);($key=key($ary))!==null;next($ary)) {
$ary[$key] = addslashes($ary[$key]);
}
$te = microtime();
return timediff( $ts, $te );
}
function test2( &$ary ) {
$ts = microtime();
array_walk( $ary, 'mycbfunc' );
$te = microtime();
return timediff( $ts, $te );
}
function test3( &$ary ) {
$ts = microtime();
$tmp = array();
foreach ( $ary as $key=>$value ) {
$tmp[$key] = addslashes( $value );
}
$ary = $tmp;
$te = microtime();
return timediff( $ts, $te );
}
$ary1 = $ary_org;
printf( "test1: %f\n", test1( $ary1 ) );
$ary2 = $ary_org;
printf( "test2: %f\n", test2( $ary2 ) );
$ary3 = $ary_org;
printf( "test3: %f\n", test3( $ary3 ) );
if( $ary1 != $ary2 || $ary1 != $ary2 ) {
print "?\n";
}
?>
Yasuo Ohgaki <yohgaki@ohgaki.net> wrote:
> 大垣です。
>
> Mashiki wrote:
> > Mashikiです。
> >
> > 使用したことはないですが
> > array_walk()
> > は使用できないでしょうか
>
> できます。
>
> foreach()とどっちが早いか、と言う点ではexecute()
> を呼ばない分、array_walk()の方が早いと思います。
>
> # 試していませんが、コードからするとarray_walk()
> # の方が効率的です。
> # と書いて、ベンチマークをポストしてくださる事を期待 :)