性能专题 - 代码质量 ¶
作者:KK
发表日期:2016.10.15
这里从平时写代码的细节说明一些对性能有影响的写法,而且是平时常见的,不常见的就不提了
尽量用单引号表示字符串
如果拼接的字符串不到4个的话尽量使用单引号表示字符串,否则PHP总是会尝试向双引号字符串里查找变量进行替换
这里有特别指出我见过很多程序员都是习惯性地用双引号写字符串,希望这种观念要变,习惯归习惯,因为你的习惯写了质量不好的代码并不值得
参考:我是统一要求整个项目都用单引号字符串,虽然个别字符串拼接数量会达到4个以上,但其实并不多,影响很少。然而统一了要求之后,我可以在持续集成平台上部署自动检查代码的程序帮我提醒程序员
数组的key要用单引号引住
$user[name] = 'Jay'
默认情况下是等同于$user['name'] = 'Jay'
的,但如果代码是这样的时候呢?define('name', 'xxx'); $user[name] = 'Jay';
我们都能看得出,PHP会先查找一下有没有
name
这个常量,有就用这个常量的值作为key,没有就用这个常量的名称转换成字符串作为key如果直接写
'name'
的话那PHP就不用去查询有没有定义过常量了嘛然而实际上并不会有人去定义name这种常量,因为几乎所有人都知道了常量定义都用大写下划线分词,所以不会踩这个坑,只是这样写带来了不好的性能问题,让PHP多做了些无谓的事情
for的时候先计算一下次数
这样是低质量的代码:
for($i = 0; $i < count($dataList); $i++){}
原因是每一次结束后都会再执行
$i < count($dataList)
这个比较条件看看是否成立,成立就继续for,不成立就跳出for这个条件有什么问题?聪明人一看就懂,每次都在重新count啊,如果这个数组很大,用屁股想都知道需要多一点时间才能count出来
所以优化代码应该是:
$count = count($dataList); for($i = 0; $i < $count; $i++){}
尽量用foreach代替for
写for i循环是大家的习惯,但是优秀的程序员都会尽量用foreach
这样就不需要先count一下了,每次循环后直奔下一个元素继续循环的,我的写法:
foreach($dataList as $data){} foreach($dataList as $i => $data){}
释放大数组
如果一个数组的元素达到上百个,那用完它之后如果还没太快return,那就最好unset它
因为前面内存回收讲过了,unset的变量内存空间可以给其他内存利用,这样就缓解了内存峰值增长
用include/require代替include_once/require_once
从性能上来说,如果用once加载的话每次加载前都会搜索已加载的文件列表,这就是用include可以节省性能的好处
从有没有必要once的角度来说,我们写代码都能防止一个类似
App::start()
这样的方法被重复调用,难道就不能防止include函数被重复调用,而要靠once来帮我们检测?————那只能说你还需要进一步锻炼代码的架构能力从资深专家的角度来说,他发表了相关文章:《再一次, 不要使用(include/require)_once》
语法级别比函数级别的性能快
比如要输出内容,
print('content')
要比echo 'content'
慢,因为print是函数,echo是语句而不是函数,它是语法的一部分类型转换时用
(int)$str
做强制转换好过intval($str)
,因为强制转换也是语法级别的嘛,其它转换也是如此
内置函数比自定义函数运行得快
能用内置完成的事情就不要自己写同样功能的函数去实现,这偶尔见过,可能是程序员对内置函数并不了解,但有时候是偏偏觉得他自己写的函数才比较漂亮
内置函数是通过C语言写的当然快,还有就是自定义函数还需要让PHP去解析脚本,内置函数并不需要呀
项目中的大函数、算法如果影响了性能表现,那考虑一下用C写成扩展加载进来调用吧
别动不动就用正则表达式,能用自带函数去处理字符串就最好,正则效率是较慢的
用
$count += 1
来累加,而不是$count = $count + 1
其实要细数PHP里各个要注意性能的地方还真能数出几十处,但我这只提了常见的10处,原因是我觉得常见的也就是经常会影响性能的
对于不常见的性能问题,尽管偶尔有程序员触犯了,但也只是那么一两个地方,影响微乎其微,我的价值观认为先把常见的性能代码质量搞好再说
其他的随着程序员的成长,都会自觉地好起来
另外 ¶
其实通常Web应用的性能问题主要都表现在数据库上,我们更应该掌握数据库的性能优化技能
脚本编码的性能影响是比较微弱的,甚至你可能感知得并不明显,然而为什么还要抓代码质量呢?
因为代码质量好了,程序员的素质就提高了,这一点很重要,也使程序员更加严谨,严谨的态度在工作上是有很大的长远利益的