[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()
> # の方が効率的です。
> # と書いて、ベンチマークをポストしてくださる事を期待 :)