`
bardo
  • 浏览: 379343 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
D1407912-ab64-3e76-ae37-b31aa4afa398
浅述PHP设计模式
浏览量:11831
9d6df9f7-91da-3787-a37c-0e826525dd5d
Zend Framewor...
浏览量:10140
85b628bd-a2ed-3de2-a4b1-0d34985ae8b6
PHP的IDE(集成开发环...
浏览量:9529
社区版块
存档分类
最新评论

向PHP要效率——加快你的代码执行速度

    博客分类:
  • PHP
阅读更多

脚本语言效率都是低下的,PHP也不例外。而效率的高低实际上,都是在你的每一行代码中节省或浪费的。所以,这里向你讲解一些基本的效率常识,让你的代码执行速度快起来。
(注:看过N多版本的优化PHP代码的建议,觉得不系统,也不全面,这里只是给出平常极需要注意的一些。)

一、字符串问题

1、字符中拼接大于数组的implode, 也快于sprintf

你可以执行一下下面的代码:

<?php

    /**
     * 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.14

t i m e :0.25

2、字符串替换

同时,如果不能拼接,才考虑替换。而替换方式,要按以下的优先方式考虑写代码:

sprintf 快于 str_replace 快于 preg_replace 快于 strstr

3、字符串查找,字符串比较:

网上有人测试的结果是:

Results
ereg .956
preg_match .050
strstr .222
strpos .033
可见:
strpos 快于 preg_match 快于 strstr 快于 ereg
有人说,strstr快,但,preg_match_all肯定比for循环中的strstr快,如果能够explode,则还要比preg_match_all快

3、字符串输出:
echo 快于 print, 这不用讲了。 但是,如果将echo用到最快?

$foo = 'John SMITH'; 
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.';


我想,你能看得懂的,最后一个最快。


二、数组问题:

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还是快于它)
This function is five times faster than in_array(). It uses a binary search and should be able to be used as a direct replacement:

<?php 
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];
  
三、函数问题

使用正名函数,不要用函数的别名。别名在PHP中是用于PHP的推广(比如split,join是VB中有的函数,implode,explode则是正名函数),或用于向旧版本兼容。一般速度没有正名的快。
  
count 快于 sizeof
is_integer 快于 is_int
floatval 快于 doubleval
implode 快于 join
ini_set 快于 ini_alter

当然,也有极个别的例外,比如:fputs 快于 fwrite, 我觉得,可以不管它。

1
0
分享到:
评论

相关推荐

    ZendOptimizer-3.3.0-Windows-i386

    ZendOptimizer-3.3.0-Windows-i386是一个针对32位Windows系统的PHP性能优化工具,它通过优化PHP代码执行,提高Web应用的响应速度,同时提供版权保护和性能监控功能。为了利用这些优势,用户需要下载提供的exe文件...

    PHP中加速、缓存扩展的区别和作用详解(eAccelerator、memcached、xcache、APC )

    PHP加速缓存扩展是用于提升PHP应用性能的一类工具,它们通过不同的机制减少服务器资源消耗、减少数据库访问次数,以及加快脚本执行速度。本文将详细介绍PHP中几个流行的加速缓存扩展——eAccelerator、memcached、...

    PHP7如何开启Opcode打造强悍性能详解

    标题中的“PHP7如何开启Opcode打造强悍性能详解”是指通过启用PHP7的内置模块Opcache,提升PHP脚本的执行效率,降低CPU和内存的消耗。描述中提到,Opcache是PHP官方公司Zend开发的优化加速组件,能够将PHP代码预编译...

    Laravel开发-productivity

    首先,我们要了解Laravel的核心——Artisan命令行工具。Artisan是Laravel自带的一个强大的命令行接口(CLI),用于生成控制器、模型、迁移、路由等基础结构,甚至自定义命令。通过Artisan,开发者可以快速创建项目...

    phpStudy20180211.zip

    同时,启动和关闭服务的速度也有所加快,提升了开发者的工作效率。 “稳定”是这个版本的另一个关键亮点。PHPStudy20180211在前代基础上进行了大量的错误修复和稳定性测试,确保在各种环境下都能稳定运行。这使得...

    Laravel开发-laravel-php-elixir-revision

    2. **自动刷新**:通过开启实时刷新(LiveReload)功能,Elixir 可以在代码更改时自动刷新浏览器,无需手动刷新,加快了开发迭代速度。 3. **文件版本控制**:Elixir 可以自动为编译后的文件添加时间戳或哈希,确保...

    EditPlus V2.11 Build 1067 汉化版

    同时,其自动完成功能能减少手动输入,加快编程速度。 3. **项目管理与多文档界面**:EditPlus提供了项目管理功能,允许用户同时打开并管理多个文件或项目,这对于需要处理大量文本的用户来说非常实用。多文档界面...

    取色工具的阿尔取色工具

    3. **自动完成**:输入代码时,提供智能提示,加快编码速度。 4. **宏功能**:录制和播放宏,重复执行一系列操作。 5. **文件搜索**:快速搜索文件内容,定位代码。 6. **FTP/SFTP集成**:直接通过编辑器上传和下载...

    任务跟踪器:PHP7.3,Laravel 6,MySQL

    另外,Laravel Horizon的引入提供了队列监控,有助于优化后台任务的执行效率。 3. MySQL与MariaDB数据库集成: 作为任务跟踪系统的核心,数据库用于存储任务信息、用户数据和权限设置等。MySQL与MariaDB都是广泛...

    单元测试详解

    2. **加快开发速度**:在开发早期发现问题可以避免后期修复成本高昂的问题,从而加快整个项目的进度。 3. **简化维护工作**:随着软件系统的不断演化,良好的单元测试覆盖可以显著减少未来维护时的工作量。 4. **...

    mysql_in_a_nutshell_2nd_edition.pdf 英文全本

    - **索引**:为了提高查询效率,MySQL提供了索引机制,通过创建索引可以大大加快数据检索的速度。 #### 2. SQL基础 - **SELECT语句**:用于从数据库中查询数据,是最常用的SQL语句之一。 - **INSERT语句**:用于向...

    织梦CMS文章主动推送百度插件,站长必用!

    而“织梦CMS文章主动推送百度插件”为站长们提供了将新内容快速推送给百度的途径,使新内容被索引的速度大大加快,从而提升网站的搜索排名。 该插件使用起来十分便捷。站长们首先需要下载最新版本的插件压缩包,并...

Global site tag (gtag.js) - Google Analytics