性能专题 - 代码质量

  • 作者:KK

  • 发表日期:2016.10.15


这里从平时写代码的细节说明一些对性能有影响的写法,而且是平时常见的,不常见的就不提了


  1. 尽量用单引号表示字符串

    如果拼接的字符串不到4个的话尽量使用单引号表示字符串,否则PHP总是会尝试向双引号字符串里查找变量进行替换

    这里有特别指出我见过很多程序员都是习惯性地用双引号写字符串,希望这种观念要变,习惯归习惯,因为你的习惯写了质量不好的代码并不值得

    参考:我是统一要求整个项目都用单引号字符串,虽然个别字符串拼接数量会达到4个以上,但其实并不多,影响很少。然而统一了要求之后,我可以在持续集成平台上部署自动检查代码的程序帮我提醒程序员


  2. 数组的key要用单引号引住

    $user[name] = 'Jay'默认情况下是等同于$user['name'] = 'Jay'的,但如果代码是这样的时候呢?

    define('name', 'xxx');
    $user[name] = 'Jay';
    

    我们都能看得出,PHP会先查找一下有没有name这个常量,有就用这个常量的值作为key,没有就用这个常量的名称转换成字符串作为key

    如果直接写'name'的话那PHP就不用去查询有没有定义过常量了嘛

    然而实际上并不会有人去定义name这种常量,因为几乎所有人都知道了常量定义都用大写下划线分词,所以不会踩这个坑,只是这样写带来了不好的性能问题,让PHP多做了些无谓的事情


  3. 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){}
      

  4. 释放大数组

    如果一个数组的元素达到上百个,那用完它之后如果还没太快return,那就最好unset它

    因为前面内存回收讲过了,unset的变量内存空间可以给其他内存利用,这样就缓解了内存峰值增长


  5. 用include/require代替include_once/require_once

    从性能上来说,如果用once加载的话每次加载前都会搜索已加载的文件列表,这就是用include可以节省性能的好处

    从有没有必要once的角度来说,我们写代码都能防止一个类似App::start()这样的方法被重复调用,难道就不能防止include函数被重复调用,而要靠once来帮我们检测?————那只能说你还需要进一步锻炼代码的架构能力

    从资深专家的角度来说,他发表了相关文章:《再一次, 不要使用(include/require)_once


  6. 语法级别比函数级别的性能快

    比如要输出内容,print('content')要比echo 'content'慢,因为print是函数,echo是语句而不是函数,它是语法的一部分

    类型转换时用(int)$str做强制转换好过intval($str),因为强制转换也是语法级别的嘛,其它转换也是如此


  7. 内置函数比自定义函数运行得快

    能用内置完成的事情就不要自己写同样功能的函数去实现,这偶尔见过,可能是程序员对内置函数并不了解,但有时候是偏偏觉得他自己写的函数才比较漂亮

    内置函数是通过C语言写的当然快,还有就是自定义函数还需要让PHP去解析脚本,内置函数并不需要呀


  8. 项目中的大函数、算法如果影响了性能表现,那考虑一下用C写成扩展加载进来调用吧


  9. 别动不动就用正则表达式,能用自带函数去处理字符串就最好,正则效率是较慢的


  10. $count += 1来累加,而不是$count = $count + 1


其实要细数PHP里各个要注意性能的地方还真能数出几十处,但我这只提了常见的10处,原因是我觉得常见的也就是经常会影响性能的

对于不常见的性能问题,尽管偶尔有程序员触犯了,但也只是那么一两个地方,影响微乎其微,我的价值观认为先把常见的性能代码质量搞好再说

其他的随着程序员的成长,都会自觉地好起来


另外

其实通常Web应用的性能问题主要都表现在数据库上,我们更应该掌握数据库的性能优化技能

脚本编码的性能影响是比较微弱的,甚至你可能感知得并不明显,然而为什么还要抓代码质量呢?

因为代码质量好了,程序员的素质就提高了,这一点很重要,也使程序员更加严谨,严谨的态度在工作上是有很大的长远利益的