php 常用方法效率比較
阿新 • • 發佈:2019-01-01
- 陣列問題
foreach與for 效率比較
foreach 快於 for 這是大家都明白的。 不僅如此。如果真的用for ,你這樣寫是最好的
for(j=count(i<i++){
}
前面說了,陣列用來做字串拼接,會慢,因為,你走了兩迴圈。但很多操作,如果能用陣列協助完成,則會很快。
比如:array_map(‘trim’,$array)肯定比你寫for,foreach要快很多。
能先用explode拆成陣列,最好不要在for迴圈中使用strpos.
in_array函式的效率問題。如果in_array頻繁使用,而陣列很大,建議將這個陣列排序,然後,用fast_in_array
這是PHP手冊中的使用者新增的函式。(注:有待測試結果,小陣列,in_array還是快於它)
function fast_in_array($elem, $array)
{
$top = count($array) -1;
$bot = 0;
while($top >= $bot)
{
$p = floor(($top + $bot) / 2);
if ($array[$p] < $elem) $bot = $p + 1;
elseif ($array[$p] > $elem) $top = $p - 1;
else return TRUE ;
}
return FALSE;
}
用陣列改變你的所有能改變的控制結構。這不僅包括三元運算子,還有:if,switch。這還有另一好處,那就是能培養你的軟編碼模式的思維。
Instead of
$class = $class == 'even' ? 'odd' : 'even'
we have
$flip = array('even' => 'odd', 'odd' => 'even');
$class = $flip[$class];
示例:
header("content-type:text/html;charset=utf-8" );
/**
* array_walk 和 foreach, for 的效率的比較。
* 我們要測試的是foreach, for, 和 array_walk的效率的問題。
*/
//產生一個10000的一個數組。
$max = 10000;
$test_arr = range(0, $max);
$temp = 0;
//我們分別用三種方法測試求這些數加上1的值的時間。
// for 的方法
$t1 = microtime(true);
for ($i = 0; $i < $max; $i++) {
$temp = $temp + 1;
}
$t2 = microtime(true);
$t = $t2 - $t1;
echo "就使用for, 沒有對陣列操作 花費: {$t}<br>";
$t1 = microtime(true);
for ($i = 0; $i < $max; $i++) {
$test_arr[$i] = $test_arr[$i] + 1;
}
$t2 = microtime(true);
$t = $t2 - $t1;
echo "使用for 並且直接對陣列進行了操作 花費: {$t}<br>";
$t1 = microtime(true);
for ($i = 0; $i < $max; $i++) {
addOne($test_arr[$i]);
}
$t2 = microtime(true);
$t = $t2 - $t1;
echo "使用for 呼叫函式對陣列操作 花費 : {$t}<br>";
$t1 = microtime(true);
foreach ($test_arr as $k => &$v) {
$temp = $temp + 1;
}
$t2 = microtime(true);
$t = $t2 - $t1;
echo "使用 foreach 沒有對陣列操作 花費 : {$t}<br>";
$t1 = microtime(true);
foreach ($test_arr as $k => &$v) {
$v = $v + 1;
}
$t2 = microtime(true);
$t = $t2 - $t1;
echo "使用 foreach 直接對陣列操作 : {$t}<br>";
$t1 = microtime(true);
foreach ($test_arr as $k => &$v) {
addOne($v);
}
$t2 = microtime(true);
$t = $t2 - $t1;
echo "使用 foreach 呼叫函式對陣列操作 : {$t}<br>";
$t1 = microtime(true);
array_walk($test_arr, 'addOne');
$t2 = microtime(true);
$t = $t2 - $t1;
echo "使用 array_walk 花費 : {$t}<br>";
function addOne(&$item) {
$item = $item + 1;
}
結果:
就使用for, 沒有對陣列操作 花費: 0.003000020980835
使用 foreach 沒有對陣列操作 花費 : 0.002000093460083
使用for 並且直接對陣列進行了操作 花費: 0.0039999485015869
使用 foreach 直接對陣列操作 : 0.0019998550415039
使用for 呼叫函式對陣列操作 花費 : 0.53900003433228
使用 foreach 呼叫函式對陣列操作 : 0.54800009727478
使用 array_walk 花費 : 0.56699991226196
- 字串問題
1) 字串拼接
字元中拼接 大於 陣列的implode, 也快於sprintf
示例:
/**
* Simple function to replicate PHP 5 behaviour
*/
function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$start=microtime_float();
// standard string append
$str = '';
for ($i = 300000; $i > 0; $i--) {
$str .= 'String concatenation. ';
}
$end = microtime_float();
echo("<br/> t i m e :" . round( $end - $start ,2) ."<br/>");
$start=microtime_float();
// array join
$str = '';
$sArr = array();
for ($i = 300000; $i > 0; $i--) {
$sArr[] = 'String concatenation. ';
}
$str = implode('',$sArr);
$end = microtime_float();
echo("<br/> t i m e :" . round( $end - $start ,2) ."<br/>");
結果:
t i m e :0.12
t i m e :0.22
2)字串替換
sprintf 快於 str_replace 快於 preg_replace 快於 strstr
3)字串查詢
strpos 快於 preg_match 快於 strstr 快於 ereg
4)字串輸出
echo 快於 print
echo "Hello $foo, welcome on my blog.";
echo "Hello " . $foo . " welcome on my blog.";
echo 'Hello ' . $foo . ' welcome on my blog.';
echo 'Hello ', $foo , ' welcome on my blog.';
- 函式問題
使用正名函式,不要用函式的別名。別名在PHP中是用於PHP的推廣(比如split,join是VB中有的函式,implode,explode則是正名函式),或用於向舊版本相容。一般速度沒有正名的快。
eg.
count 快於 sizeof
is_integer 快於 is_int
floatval 快於 doubleval
implode 快於 join
ini_set 快於 ini_alter