温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

PHP性能分析相关的函数与命令有什么以及性能如何

发布时间:2021-10-18 17:40:35 来源:亿速云 阅读:126 作者:柒染 栏目:编程语言

PHP性能分析相关的函数与命令有什么以及性能如何,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

  我们从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次内存比较的速度差距,一个文件包含就相当了。   

关于PHP性能分析相关的函数与命令有什么以及性能如何问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

php
AI