トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

PHP、処理速度計測

[カテゴリ:PHP]

処理速度計測

文字列比較 と 値/参照渡し

  • 文字列比較は === が早い
  • 参照渡し が早い

計測結果

--- 開始 
0.0680639743805 : ===
0.19106388092 : ==
0.189730882645 : strcmp
0.0871348381042 : 文字列 " 
0.0852861404419 : 文字列 ' 
0.348495960236 : 参照渡し
0.381975889206 : 値渡し
--- 開始 
0.0682990550995 : ===
0.179833889008 : ==
0.190254926682 : strcmp
0.0860779285431 : 文字列 "" 
0.0857908725739 : 文字列 '' 
0.349301815033 : 参照渡し
0.368932962418 : 値渡し

スクリプト

<?php

main();
main();
exit();

function getmicrotime()
{
	list($msec, $sec) = explode(' ', microtime());
	return ((float)$sec + (float)$msec);
}

function timeset(&$val)
{
	if ($val['TIME'] === null) {
		$val['TIME'] = getmicrotime();
	} else {
		$val['TIME'] = getmicrotime() - $val['TIME'];
		print $val['TIME'] . ' : ' . $val['NAME'] . "<br />\n";
	}
}

function func1(&$val)
{
	$val = "hoge";
}

function func2($val)
{
	$val = "hoge";
}

function main()
{
	print "--- 開始  <br />\n";
	$max = 100000;
	$aaa = "1234567891";
	$bbb = "123456789";
	$i = 0;
	$str = "";

	// ---------------------------------------------------------
	$tst = array(
		'NAME'	=> '===',
		'TIME'	=> null,
	);
	timeset($tst);
	for ($i = 0; $i < $max; $i ++) {
		if ($aaa === $bbb) {};
		if ($aaa === $bbb) {};
		if ($aaa === $bbb) {};
	}
	timeset($tst);

	// ---------------------------------------------------------
	$tst = array(
		'NAME'	=> '==',
		'TIME'	=> null,
	);
	timeset($tst);
	for ($i = 0; $i < $max; $i ++) {
		if ($aaa == $bbb) {};
		if ($aaa == $bbb) {};
		if ($aaa == $bbb) {};
	}
	timeset($tst);

	// ---------------------------------------------------------
	$tst = array(
		'NAME'	=> 'strcmp',
		'TIME'	=> null,
	);
	timeset($tst);
	for ($i = 0; $i < $max; $i ++) {
		if (!strcmp($aaa, $bbb)) {};
		if (!strcmp($aaa, $bbb)) {};
		if (!strcmp($aaa, $bbb)) {};
	}
	timeset($tst);

	// ---------------------------------------------------------
	$tst = array(
		'NAME'	=> '文字列 "" ',
		'TIME'	=> null,
	);
	timeset($tst);
	for ($i = 0; $i < $max; $i ++) {
		$str = "12345";
		$str = "22345";
		$str = "32345";
	}
	timeset($tst);

	// ---------------------------------------------------------
	$tst = array(
		'NAME'	=> '文字列 \'\' ',
		'TIME'	=> null,
	);
	timeset($tst);
	for ($i = 0; $i < $max; $i ++) {
		$str = '54321';
		$str = '54322';
		$str = '54323';
	}
	timeset($tst);

	// ---------------------------------------------------------
	$tst = array(
		'NAME'	=> '参照渡し',
		'TIME'	=> null,
	);
	timeset($tst);
	for ($i = 0; $i < $max; $i ++) {
		$val = "";
		func1($val);
		func1($val);
		func1($val);
	}
	timeset($tst);

	// ---------------------------------------------------------
	$tst = array(
		'NAME'	=> '値渡し',
		'TIME'	=> null,
	);
	timeset($tst);
	for ($i = 0; $i < $max; $i ++) {
		$val = "";
		func2($val);
		func2($val);
		func2($val);
	}
	timeset($tst);
}

?>

参考

関数の値渡しと参照渡し、どちらが速い?:
http://www.sound-uz.jp/php/test/first2.html

throw new CybozuLabsException() - PEAR::Benchmarkでプログラムの実行時間を測定する:
http://labs.cybozu.co.jp/blog/tsuruoka/anubis/blog_show/22

最終更新時間:2007年10月05日 14時20分48秒