php 常用方法效率比较
2017-01-09 14:27
344 查看
数组问题
foreach与for 效率比较
foreach 快于 for 这是大家都明白的。 不仅如此。如果真的用for ,你这样写是最好的
for(i=0,j=count(array);i<j;i++){
}
前面说了,数组用来做字串拼接,会慢,因为,你走了两循环。但很多操作,如果能用数组协助完成,则会很快。
比如:array_mar(‘trim’,$array)肯定比你写for,foreach要快很多。
能先用explode拆成数组,最好不要在for循环中使用strpos.
in_array函数的效率问题。如果in_array频繁使用,而数组很大,建议将这个数组排序,然后,用fast_in_array
这是PHP手册中的用户添加的函数。(注:有待测试结果,小数组,in_array还是快于它)
用数组改变你的所有能改变的控制结构。这不仅包括三元运算符,还有:if,switch。这还有另一好处,那就是能培养你的软编码模式的思维。
示例:
结果:
就使用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
示例:
结果:
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
函数问题
使用正名函数,不要用函数的别名。别名在PHP中是用于PHP的推广(比如split,join是VB中有的函数,implode,explode则是正名函数),或用于向旧版本兼容。一般速度没有正名的快。
eg.
count 快于 sizeof
is_integer 快于 is_int
floatval 快于 doubleval
implode 快于 join
ini_set 快于 ini_alter
foreach与for 效率比较
foreach 快于 for 这是大家都明白的。 不仅如此。如果真的用for ,你这样写是最好的
for(i=0,j=count(array);i<j;i++){
}
前面说了,数组用来做字串拼接,会慢,因为,你走了两循环。但很多操作,如果能用数组协助完成,则会很快。
比如:array_mar(‘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
相关文章推荐
- Python执行效率测试模块timei的使用方法与与常用Python用法的效率比较
- PHP中3种生成XML文件方法的速度效率比较
- PHP中字符串比较的常用方法
- Python合并两个字典的常用方法与效率比较
- Python合并两个字典的常用方法与效率比较
- php向mysql数据库插入百万级数据的两种方法效率比较
- PHP中3种生成XML文件方法的速度效率比较
- Asp.net 几种分页方法效率比较
- 几种字符串反转方法效率比较
- 几种字符串反转方法效率比较
- Asp.net 几种分页方法效率比较
- 数据库主键设计—常用方法及比较(转载)
- 几种常用排序算法运行效率比较
- php提高访问效率的方法——页面静态化——缓存
- 常用数组效率比较
- PHPExcel常用方法汇总
- php代码优化系列(二) -- array_walk 和 foreach, for 的效率的比较
- 个人技术作品 - PHP 时间戳及格林威治时间互相转换及一些常用的时间比较的API
- 几种常用排序算法运行效率比较
- 几种字符串反转方法效率比较