php中一些提高性能的技巧

【概述】

* 把类定义成static
* echo比print快
* 用全等号代替双等,减少类型转换
* echo用逗号连接字符串效率高
* require比require_once()快,并且尽量不要使用相对路径
* 使用函数代替正则
* 不要滥用@操作符
* 字符串用单引号而不是双引号,因为双引号里面会判断是否有变量
* 打开apache的mod_deflate模块可以提高网页浏览速度
* 尽量少用全局变量和对象属性($this->num++)
* 循环内部不要声明变量
* 不需要的数组或数据及时unset掉
* 多维数组尽量不要循环嵌套赋值
* 使用ip2long()和long2ip()把IP地址转成整型

一、消除不必要的错误提示

有很多朋友编程的时候遇到notice和warning这类的错误,如果不影响正常的逻辑就不去处理了,类似下面这种

<?php

    //想在循环中拼接字符串,却不初始化字符串直接使用 .=
    $list = array(
        1=>‘hello‘,
        2=>‘world‘
            //...
    );
    foreach($list as $key=>$val){
        $str .= $val;
    }
    // Notice: Undefined variable: str in D:\11\index.php

    /*********************************************************/

    //不注意的数组下标越界或key不存在
    $List_1 = array(‘1‘,‘2‘);
    echo $List_1[3];
    //Notice: Undefined offset: 3 in D:\11\index.php on line 13

    /*********************************************************/

    //使用已经过时的函数  比如使用函数mysql_escape_string()会有如下提示

//Deprecated: mysql_escape_string(): This function is deprecated; use mysql_real_escape_string() instead. in D:\readCode\xhprofshoujikanbingcom\cgi\xhprof.php on line 51

  /*********************************************************/

    //静态的调用非静态的方法 报E_STRICT
class Cl_a{
    function a(){
        echo ‘A类的a方法‘;
    }
}
class Cl_B{
    static function b(){
        echo ‘B类的b方法‘;
    }
}

function test_1(){
    $a = new Cl_a();
    $a::a();
}
function test_2(){
    $b = new Cl_b();
    $b::b();
}

test_1();
test_2();

    //Strict standards: Non-static method Cl_a::a() should not be called statically in D:\11\index.php on line 15

?>

这种情况会导致性能的下降,凡是能引起警告(warning or E_STRICT )或者提示(notice)的代码都会走php的异常流程,记录异常日志(涉及到文件I/O)。性能可能会降低50%左右。

二、使用静态变量和方法

测试结果如下

<?php

class Cl_a{
    public $a=1;
    function a(){
        $this->a++;
    }
}
class Cl_b{
    public static $a = 1;
    static function b(){
        self::$a++;
    }
}

function test_1(){
    $a = new Cl_a();
    for($i=0;$i<1000;$i++){
        $c=$a->a+1;//外部调用
        $a->a();//内部调用
    }
    echo $a->a;
}
function test_2(){
    $b = new Cl_b();
    for($i=0;$i<1000;$i++){
        $c=$b::$a+1;//外部调用
        $b::b();//内部调用
    }
    echo $b::$a;
}
test_1(); //51012微秒
test_2(); //49039微秒

?>

三、尽量不适用@符号

说实话我没见到过必须使用@符号的地方

<?php

class Cl_a{
    public $a=1;
    function a(){
        $b =1;
    }
}

function test_1(){
    @$a = new Cl_a();
    for($i=0;$i<1000;$i++){
        @$a->a();//内部调用
    }
    echo $a->a;
}
function test_2(){
    $a = new Cl_a();
    for($i=0;$i<1000;$i++){
        $a->a();//内部调用
    }
    echo $a->a;
}
@test_1();  //51,133
test_2();   //48,381

?>

四、使用php内置的变量来代替一些函数。

某些时候也可以用$_SERVER[‘REQUEST_TIME’]替换time()。、
这个性能的提示我测试出的结果让我都有些不能相信

<?php

function test_1(){

    for($i=0;$i<1000;$i++){
        $a = php_uname(‘s‘);
        $b = phpversion();
        $c = php_sapi_name();

    }
    echo $a,$b,$c;
}
function test_2(){
    for($i=0;$i<1000;$i++){
        $a = PHP_OS;
        $b = PHP_VERSION;
        $c = PHP_SAPI;
    }
    echo $a,$b,$c;
}
test_1();   //132,015
test_2();   //340  惊不惊喜意不意外

$is_win = DIRECTORY_SEPARATOR == ‘//‘; //可以用来判断是不是windows系统 速度很快

?>

五、注意不要把一些不必要的耗时代码写到循环中

例如,cuont函数不要写在for循环的条件中,不要在循环中声明不必要的变量等。

<?php
function test_1(){
    $a = array(
    1,2,3,4,5,6,7,8,9,0,
    1,2,3,4,5,6,7,8,9,0,
    1,2,3,4,5,6,7,8,9,0,
    1,2,3,4,5,6,7,8,9,0,
    1,2,3,4,5,6,7,8,9,0,
    1,2,3,4,5,6,7,8,9,0,
    );
    for($i=0;$i<count($a);$i++){

    }

}
function test_2(){
    $a = array(
    1,2,3,4,5,6,7,8,9,0,
    1,2,3,4,5,6,7,8,9,0,
    1,2,3,4,5,6,7,8,9,0,
    1,2,3,4,5,6,7,8,9,0,
    1,2,3,4,5,6,7,8,9,0,
    1,2,3,4,5,6,7,8,9,0,
    );
    $count = count($a);
    for($i=0;$i<$count;$i++){

    }
}
test_1();//3,602
test_2();//223
?>

六、尽量用php内置的函数替换正则

这个网上有很多对比的,我就不再重新写一遍了;
直接给一下常用的三个函数性能对比:str_replace > strtr > preg_replace

七、包含文件有技巧

包含文件的时候,如果能确定不会重复包含,尽量使用include,require不要用include_once和require_once,而且包含错误(一般you 函数和变量被覆盖)通常是可以被测试出来的。
测试结果如下:

<?php
function test_1(){
    $a =‘11‘;
    for($i=0;$i<1000;$i++){
        include_once ‘a.php‘;
    }
}
function test_2(){
    $a =‘11‘;
    for($i=0;$i<1000;$i++){
        include ‘a.php‘;
    }
}

test_1();//1,477
test_2();//152,704

?>

八、可以用全等号代替双等

这个相信有很多人都知道,因为双等号是会有类型转换的。
测试结果如下:

<?php
function test_1(){
    $a =‘11‘;
    for($i=0;$i<1000;$i++){
        if($a==‘11‘){
            echo 1;
        }
    }
}
function test_2(){
    $a =‘11‘;
    for($i=0;$i<1000;$i++){
        if($a===‘11‘){
            echo 1;
        }
    }
}

test_1();//耗时501微秒
test_2();//耗时434微秒

?>

九、多维数组赋值可以使用引用来提高性能

多维数组越复杂,引用带来的性能提高越大,引用可以减少数组元素的哈希查找次数。

<?php

function test_1(){
    $a[‘b‘][‘c‘] = array();
    $a[‘b‘][‘d‘] = array();
    for($j=0;$j<1000;$j++){
        for ($i = 0; $i < 5; ++$i){
            $a[‘b‘][‘c‘][$i] = $i;
        }
    }
}
function test_2(){
    $a[‘b‘][‘c‘] = array();
    $a[‘b‘][‘d‘] = array();
    $ref =& $a[‘b‘][‘c‘];
    for($j=0;$j<1000;$j++){
        for ($i = 0; $i < 5; ++$i){
            $ref[$i] = $i;
        }
    }
}
test_1();//1270
test_2();//1015
//多维数组越复杂,引用带来的性能提高越大,引用可以减少数组元素的哈希查找
?>

十、大的数组或数据如果使用完毕,及时unset掉

这个就不用过多解释了,节省内存。

十一、不做无意义的封装

如果不能实现特别好的设计,解耦,复用效果可以不封装简单方法
因为每次调用方法都会开辟一个新的内存区域,传值的时候对数据的引用也会增加。

十二、为代码和数据做缓存

这个数据缓存就不用说了,可能有部分朋友不知道代码缓存,代码缓存节省代码运行时间的远离:php是解释型语言,和编译型语言的区别如下:

编译型语言:编程完成后,通过预处理->编译->汇编->链接后变成可执行程序(计算机直接运行的二进制文件),以后每次运行都直接运行这个可执行性文件。

解释型语言:具体的过程这里也说不清楚,可以理解为,解释型语言每次运行的时候都相当于进行了上面编译型语言编译的过程(其实还不太一样)生成可执行的文件。
opcache就是把解释后的文件存入了内存,每次运行的时候就不用经过解释的过程,可以提高20%-100%的性能(数据来自网络,但是原理上肯定是能提升性能的,如果代码经常迭代的话慎用)。

十三、用单引号替换双引号

因为双引号的时候内部可以放变量,php会判断内部是否有变量。

<?php
function test_1(){
    $a ="1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111";
    for($i=0;$i<1000;$i++){
        echo $a;
    }

}
function test_2(){
    $a =‘1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111‘;
    for($i=0;$i<1000;$i++){
        echo $a;
    }
}
test_1();//2953
test_2();//2025
?>

原文地址:https://www.cnblogs.com/rxbook/p/10684922.html

时间: 2024-10-29 01:10:26

php中一些提高性能的技巧的相关文章

(转载)提高ASP.NET Web应用性能的技巧

在这篇文章中,将介绍一些提高 ASP.NET Web 应用性能的方法和技巧.众所周知,解决性能问题是一项繁琐的工作,当出现性能问题,每个人都会归咎于编写代码的开发人员. 那性能问题到底该如何解决?以下是应用系统发布前,作为 .NET 开发人员需要检查的点. 1.debug=「false」 当创建 ASP.NET Web应用程序,默认设置为「true」.开发过程中,设置为「true」是非常有用多,但在应用程序发布部署时,需将其设置为「false」. ? 1 <compilation default

25条提高iOS App性能的技巧和诀窍

 这篇文章来自iOS Tutorial Team 成员 Marcelo Fabri, 他是 Movile 的一个iOS开发者. Check out his personal website or follow him on Twitter.原文地址      当我们开发iOS应用时,好的性能对我们的App来说是很重要的.你的用户也希望如此,但是如果你的app表现的反应迟钝或者很慢也会伤害到你的审核. 然而,由于IOS设备的限制有时很难工作得很正确.我们开发时有很多需要我们记住这些容易忘记的决定对

asp.net提高程序性能的技巧(一)

[摘 要] 我只是提供我几个我认为有助于提高写高性能的asp.net应用程序的技巧,本文提到的提高asp.net性能的技巧只是一个起步,更多的信息请参考<Improving ASP.NET Performance>一书. 1. 数据库访问性能优化 数据库的连接和关闭 访问数据库资源需要创建连接.打开连接和关闭连接几个操作.这些过程需要多次与数据库交换信息以通过身份验证,比较耗费服务器资源.ASP.NET中提供了连接池(Connection Pool)改善打开和关闭数据库对性能的影响.系统将用户

[转]25条提高iOS App性能的技巧和诀窍

以下这些技巧分为三个不同那个的级别---基础,中级,高级. 基础 这些技巧你要总是想着实现在你开发的App中. 1. 用ARC去管理内存(Use ARC to Manage Memory) 2.适当的地方使用reuseIdentifier(Use a reuseIdentifier Where Appropriate) 3.尽可能设置视图为不透明(Set View as Opaque When Possible) 4.避免臃肿的XIBs文件(Avoid Fat XiBs) 5.不要阻塞主进程(D

SQL中使用WITH AS提高性能,使用公用表表达式(CTE)简化嵌套SQL

一.WITH AS的含义     WITH AS短语,也叫做子查询部分(subquery factoring),可以让你做很多事情,定义一个SQL片断,该SQL片断会被整个SQL语句所用到.有的时候,是为了让SQL语句的可读性更高些,也有可能是在UNION ALL的不同部分,作为提供数据的部分. 特别对于UNION ALL比较有用.因为UNION ALL的每个部分可能相同,但是如果每个部分都去执行一遍的话,则成本太高,所以可以使用WITH AS短语,则只要执行一遍即可.如果WITH AS短语所定

Java编程中提高性能的几点建议

尽量减少对变量的重复计算 如 for(int i=0;i<list.size();i++) 应该改为 for(int i=0,len=list.size();i<len;i++) 并且在循环中应该避免使用复杂的表达式,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快. 尽量使用移位来代替'a/b'的操作 "/"是一个代价很高的操作,使用移位的操作将会更快和更有效 如 int num = a / 4; int num = a /

整理一些提高C#编程性能的技巧

1.使用StringBuilder代替使用string 连接符 "+" 说明:String类对象是不可变的(只读),一旦创建该对象,就不能修改该对象的值. 对象String对象的重新赋值,本质上是重新创建了一个String对象并将新的值赋值给该对象. 如果字符串存在较多次的拼接时候,最后使用StringBuilder类,需要引用命名空间 System.Text. 该类不是创建新的对象,而是通过Append.Insert.Remove等方法对字符串直接进行操作,最后通过 ToString

Java代码性能优化技巧

流方面: private FileOutputStream writer; writer = new FileOoutputStream(fileName); 使用BufferedOutputStream 对写入FileOutputStream的数据进行缓存 //将writer的类型由FileOutputStream 变更为BufferedOutputStream //private FileOutputStream writer; private BufferedOutputStream wr

java性能优化技巧

一.通用篇 "通用篇"讨论的问题适合于大多数 Java应用. 1.1     new 1.1     new 11..11 不用 nneeww关键词创建类的实例 用new 关键词创建类的实例时,构造函数链中的所有构造函数都会被自动调用.但如 果一个对象实现了Cloneable 接口,我们可以调用它的clone()方法.clone()方法不会调用任 何类构造函数. 在使用设计模式(Design Pattern)的场合,如果用 Factory模式创建对象,则改用clone() 方法创建新的