PHP性能分析相关的函数与命令有什么以及性能如何
创始人
2024-12-19 06:50:47
0次

  我们从PHP是解释性语言、动态语言和底层实现等三个方面,探讨了PHP性能的问题。本文就深入到PHP的微观层面,我们来了解PHP在使用和编写代码过程中,性能方面,可能需要注意和提升的地方。下面小编来讲解下PHP性能分析相关的函数与命令有什么?PHP性能如何?

  一、PHP性能分析相关的函数与命令有什么

  1.1、时间度量函数

  平时我们常用time()函数,但是返回的是秒数,对于某段代码的内部性能分析,到秒的精度是不够的。于是要用microtime函数。而microtime函数可以返回两种形式,一是字符串的形式,一是浮点数的形式。不过需要注意的是,在缺省的情况下,返回的精度只有4位小数。为了获得更高的精确度,我们需要配置precision。

  如下是microtime的使用结果。

  $start=microtime(true);

  echo$start."/n";

  $end=microtime(true);

  echo$end."/n";

  echo($end-$start)."/n";

  输出为:

  bash-3.2#phptime.php

  1441360050.3286

  1441360050.3292

  0.00053000450134277

  而在代码前面加上一行:

  ini_set("precision",16);

  输出为:

  bash-3.2#phptime.php

  1441360210.932628

  1441360210.932831

  0.0002031326293945312

  除了microtime内部统计之外,还可以使用getrusage来取得用户态的时长。在实际的操作中,也常用time命令来计算整个程序的运行时长,通过多次运行或者修改代码后运行,得到不同的时间长度以得到效率上的区别。具体用法是:timephptime.php,则在程序运行完成之后,不管是否正常结束退出,都会有相关的统计。

  bash-3.2#timephptime.php

  1441360373.150756

  1441360373.150959

  0.0002031326293945312

  real0m0.186s

  user0m0.072s

  sys0m0.077s

  因为本文所讨论的性能问题,往往分析上百万次调用之后的差距与趋势,为了避免代码中存在一些时间统计代码,后面我们使用time命令居多。

  1.2、内存使用相关函数

  分析内存使用的函数有两个:memory_get_usage、memory_get_peak_usage,前者可以获得程序在调用的时间点,即当前所使用的内存,后者可以获得到目前为止高峰时期所使用的内存。所使用的内存以字节为单位。

  $base_memory=memory_get_usage();

  echo"Hello,world!/n";

  $end_memory=memory_get_usage();

  $peak_memory=memory_get_peak_usage();

  echo$base_memory,"/t",$end_memory,"/t",($end_memory-$base_memory),"/t",$peak_memory,"/n";

  输出如下:

  bash-3.2#phphelloworld.php

  Hello,world!

  可以看到,即使程序中间只输出了一句话,再加上变量存储,也消耗了168个字节的内存。

  对于同一程序,不同PHP版本对内存的使用并不相同,甚至还差别很大。

  $baseMemory=memory_get_usage();

  classUser

  {

  private$uid;

  function__construct($uid)

  {

  $this->uid=$uid;

  }

  }

  for($i=0;$i<100000;$i++) 10000="==0)" obj="newUser($i);" php52memory.php="" 0:93784bytes="" 10000:93784bytes="" 80000:93784bytes="" 90000:93784bytes="" peak:262144bytes="" phpmemory.php="" 0:634992bytes="" 10000:634992bytes="" 80000:634992bytes="" 90000:634992bytes="" peak:786432bytes="" php56memory.php="" 0:224944bytes="" 10000:224920bytes="" 80000:224920bytes="" 90000:224920bytes="" php7memory.php="" 0:353912bytes="" 10000:353912bytes="" 80000:353912bytes="" 90000:353912bytes="" peak:2097152bytes="" obj-="">self=$obj;

  代码如下:

  $baseMemory=memory_get_usage();

  classUser

  {

  private$uid;

  function__construct($uid)

  {

  $this->uid=$uid;

  }

  }

  for($i=0;$i<100000;$i++) obj="newUser($i);" obj-="">self=$obj;

  if($i%5000===0)

  {

  echosprintf('%6d:',$i),memory_get_usage(),"bytes/n";

  }

  }

  echo"peak:",memory_get_peak_usage(true),"bytes/n";

  这时候再来看看内存的使用情况,中间表格主体部分为内存使用量,单位为字节。

  二、PHP性能如何

  下面我们根据小程序来验证一些常见的性能差别。

  2.1、使用echo还是print

  在有的建议规则中,会建议使用echo,而不使用print。说print是函数,而echo是语法结构。实际上并不是如此,print也是语法结构,类似的语法结构,还有多个,比如list、isset、require等。不过对于PHP7以下PHP版本而言,两者确实有性能上的差别。如下两份代码:

  for($i=0;$i<1000000;$i++)   {   echo("Hello,World!");   }   for($i=0;$i<1000000;$i++) timephpecho1.php="">/dev/null

  real0m0.233s

  user0m0.153s

  sys0m0.080s

  [root@localhostphpperf]#timephpecho1.php>/dev/null

  real0m0.234s

  user0m0.159s

  sys0m0.073s

  [root@localhostphpperf]#timephpecho.php>/dev/null

  real0m0.203s

  user0m0.130s

  sys0m0.072s

  [root@localhostphpperf]#timephpecho.php>/dev/null

  real0m0.203s

  user0m0.128s

  sys0m0.075s

  在PHP5.3版中效率差距10%以上。而在PHP5.4以上的版本中,区别不大,如下是PHP7中的运行效率。

  [root@localhostphpperf]#timephp7echo.php>/dev/null

  real0m0.151s

  user0m0.088s

  sys0m0.062s

  [root@localhostphpperf]#timephp7echo.php>/dev/null

  real0m0.145s

  user0m0.084s

  sys0m0.061s

  [root@localhostphpperf]#timephp7echo1.php>/dev/null

  real0m0.140s

  user0m0.075s

  sys0m0.064s

  [root@localhostphpperf]#timephp7echo1.php>/dev/null

  real0m0.146s

  user0m0.077s

  sys0m0.069s

  正如浏览器前端的一些优化准则一样,没有啥特别通用的原则,往往根据不同的情况和版本,规则也会存在不同。

  2.2、require还是require_once?

  在一些常规的优化规则中,会提到,建议使用require_once而不是require,现由是require_once会去检测是否重复,而require则不需要重复检测。

  在大量不同文件的包含中,require_once略慢于require。但是require_once的检测是一项内存中的行为,也就是说即使有数个需要加载的文件,检测也只是内存中的比较。而require的每次重新加载,都会从文件系统中去读取分析。因而require_once会比require更佳。咱们也使用一个例子来看一下。

  str.php

  global$str;

  $str="Chinahasalargepopulation";

  require.php

  for($i=0;$i<100000;$i++){   require"str.php";   }   require_once.php   for($i=0;$i<100000;$i++){   require_once"str.php";   }   上面的例子,在PHP7中,require_once.php的运行速度是require.php的30倍!在其他版本也能得到大致相同的结果。   [root@localhostphpperf]#timephp7require.php   real0m1.712s   user0m1.126s   sys0m0.569s   [root@localhostphpperf]#timephp7require.php   real0m1.640s   user0m1.113s   sys0m0.515s   [root@localhostphpperf]#timephp7require_once.php   real0m0.066s   user0m0.063s   sys0m0.003s   [root@localhostphpperf]#timephp7require_once.php   real0m0.057s   user0m0.052s   sys0m0.004s   从上可以看到,假如存在大量的重复加载的话,require_once明显优于require,因为重复的文件不再有IO操作。即使不是大量重复的加载,也建议使用require_once,因为在一个程序中,一般不会存在数以千百计的文件包含,100次内存比较的速度差距,一个文件包含就相当了。   

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...