3.11 用C扩展方式实现
如果在代码中存在大量耗时的函数,可以考虑用C扩展的方式实现它们 。
4 变量4.1 及时销毁变量
数组、对象和GLOBAL变量在 PHP 中特别占内存的,这个由于 PHP 的底层的zend引擎引起的 。
一般来说,PHP数组的内存利用率只有 1/10 。
也就是说,一个在C语言里面100M 内存的数组,在PHP里面就要1G 。
特别是,在PHP作为后台服务器的系统中,经常会出现内存耗费太大的问题 。
4.2 使用$_SERVER变量
如果你需要得到脚本执行的时间,$_SERVER['REQUSET_TIME']优于time() 。
一个是现成就可以直接用,一个还需要函数得出的结果 。
4.3 方法里建立局部变量
在类的方法里建立局部变量速度最快,几乎和在方法里调用局部变量一样快 。
4.4 局部变量比全局变量快
由于局部变量是存在栈中的 。
当一个函数占用的栈空间不是很大的时候,这部分内存很有可能全部命中cache,CPU访问的效率是很高的 。
相反,如果一个函数同时使用全局变量和局部变量,当这两段地址相差较大时,cpu cache需要来回切换,效率会下降 。
4.5 局部变量而不是对象属性
建立一个对象属性(类里面的变量,例如:$this->prop++)比局部变量要慢3倍 。
4.6 提前声明局部变量
建立一个未声明的局部变量,要比建立一个已经定义过的局部变量慢9-10倍 。
4.7 谨慎声明全局变量
声明一个未被任何一个函数使用过的全局变量,也会使性能降低 。
这和声明相同数量的局部变量一样,PHP可能去检查这个全局变量是否存在 。
4.8 使用++$i递增
当执行变量$i的递增或递减时,$i++会比++$i慢一些 。
这种差异是PHP特有的,并不适用于其他语言,所以请不要修改你的C或JAVA代码,并指望它们能立即变快,没用的 。
++$i更快是因为它只需要3条指令(opcodes),$i++则需要4条指令 。
后置递增实际上会产生一个临时变量,这个临时变量随后被递增 。
而前置递增直接在原值上递增 。
这是最优化处理的一种,正如Zend的PHP优化器所作的那样 。
牢记,这个优化处理不失为一个好主意,因为不是所有的指令优化器都会做同样的优化处理 。
4.9 不要随便复制变量
有时候为了使 PHP 代码更加整洁,一些 PHP 新手(包括我)会把预定义好的变量,复制到一个名字更简短的变量中 。
其实这样做的结果是增加了一倍的内存消耗,只会使程序更加慢 。
试想一下,在下面的例子中,如果用户恶意插入 512KB 字节的文字,就会导致 1MB 的内存被消耗!
// 不好的实践$description = $_POST['description'];echo $description;// 好的实践 echo $_POST['description'];4.10 循环内部不要声明变量
尤其是大变量,这好像不只是PHP里面要注意的问题吧?
4.11 一定要对变量进行初始化
这里的“初始化”指的是“声明” 。
当需要没有初始化的变量,PHP解释器会自动创建一个变量,但依靠这个特性来编程并不是一个好主意 。
这会造成程序的粗糙,或者使代码变得另人迷惑 。
因为你需要探寻这个变量是从哪里开始被创建的 。
另外,对一个没有初始化的变量进行递增操作要比初始化过的来得慢 。
所以对变量进行初始化会是个不错的主意 。
5 数组5.1 用字符串而不是数组作为参数
如果一个函数既能接受数组,又能接受简单字符做为参数,那么尽量用字符作为参数 。
例如,字符替换函数,参数列表并不是太长,就可以考虑额外写一段替换代码 。
使得每次传递参数都是一个字符,而不是接受数组做为查找和替换参数 。
5.2 数组元素加引号
$row['id']比$row[id]速度快7倍 。
如果不带引号,例如$a[name],那么PHP会首先检查有没有define定义的name常量 。
如果有,就用这个常量值作为数组键值 。如果没有,再查找键值为字符串'name'的数组元素 。
多了一个查找判断的过程,所以建议养成数组键名加引号的习惯 。
正如上面字符串部分所述,用'又比用"速度更快 。
5.3 多维数组操作
多维数组尽量不要循环嵌套赋值 。
5.4 循环用foreach
尽量用foreach代替while和for循环,效率更高 。
6 架构6.1 压缩输出
在php.ini中开启gzip压缩:
zlib.output_compression = Onzlib.output_compression_level = (level)level可能是1-9之间的数字,你可以设置不同的数字 。
推荐阅读
- 建议收藏 全网最全的SQL语句
- 龙井冲泡,西湖龙井冲泡方法的小技巧
- Linux 安装Git
- 荷叶茶副作用,柠檬荷叶茶的副作用
- 如何让蜘蛛有效的爬行你的网站?
- 程序员常见的职业病有哪些?
- 菊花特点,菊花的特点是什么
- 陶器瓷器区别,三大茶具的优势区别
- 提高开发效率的 9 个工具
- 用Python远程登陆服务器的最佳实践
