PHP NOTICE级错误提示对程序性能影响的研究

我是个有代码洁癖的人,写出来的程序上线后不想见到任何错误 ,而且我也认为错误信息虽然被屏蔽了,但是应该会影响性能的,曾想去验证我这个想法,但还没去验证过,今天正好看到一文章是说这个情况,验证了我的观点,于是摘录如下:

很多人开发php的时候喜欢关掉一部分的错误提示,尤其是Notice级别的提示,这样做可以省去一些严格判断的代码。而平时开发喜欢开着E_ALL级别的我今天在接手同事的项目时,看着满屏幕Notice错误时突然想到了1个问题:

在关掉错误提示时,那么程序代码中大量的notice级别错误是否会造成PHP性能下降,从而使关闭错误输出成为一个掩耳盗铃的做法呢?
下面我来用性能测试来证明这个推论:
测试1:
在关闭错误显示的情况下,测试未初始化变量和已初始化变量在10000000次循环中的性能
变量已初始化的循环代码如下:
PHP代码
  1. $start = getmicrotime();  
  2. error_reporting(E_ALL | E_STRICT);  
  3. ini_set('display_errors', false);  
  4. ini_set('log_errors', false);  
  5. $var=1;  
  6. for ($i=0; $i < 10000000; $i++) {   
  7.     $foo=$var;  
  8. }  
  9. $end = getmicrotime();  
  10. echo $end – $start;  
  11.   
  12. function getmicrotime(){  
  13.     list($usec,$sec)=explode(" ",microtime());  
  14.     return ((float)$usec+(float)$sec);  
  15. }  
变量未初始化的循环代码如下:
PHP代码
  1. $start = getmicrotime();  
  2. error_reporting(E_ALL | E_STRICT);  
  3. ini_set('display_errors', false);  
  4. ini_set('log_errors', false);  
  5.   
  6. for ($i=0; $i < 10000000; $i++) {   
  7.     $foo=$var;  
  8. }  
  9. $end = getmicrotime();  
  10. echo $end – $start;  
  11.   
  12. function getmicrotime(){  
  13.     list($usec,$sec)=explode(" ",microtime());  
  14.     return ((float)$usec+(float)$sec);  
  15. }  
测试成绩:
初始化:平均 5.28 秒
未初始化:平均 17.2 秒
性能差距:3.25倍
 
测试2:
在关闭错误显示的情况下,测试数组索引使用引号和非引号引用在10000000次循环中的性能
数组有引号索引代码如下:
PHP代码
  1. $start = getmicrotime();  
  2. error_reporting(E_ALL | E_STRICT);  
  3. ini_set('display_errors', false);  
  4. ini_set('log_errors', false);  
  5.   
  6. $array=array('foo'=>'baa');  
  7. for ($i=0; $i < 10000000; $i++) {   
  8.     $foo=$array['foo'];  
  9. }  
  10. $end = getmicrotime();  
  11. echo $end – $start;  
  12.   
  13. function getmicrotime(){  
  14.     list($usec,$sec)=explode(" ",microtime());  
  15.     return ((float)$usec+(float)$sec);  
  16. }  
 数组无引号索引代码如下:
PHP代码
  1. $start = getmicrotime();  
  2. error_reporting(E_ALL | E_STRICT);  
  3. ini_set('display_errors', false);  
  4. ini_set('log_errors', false);  
  5.   
  6. $array=array('foo'=>'baa');  
  7. for ($i=0; $i < 10000000; $i++) {   
  8.     $foo=$array[foo];  
  9. }  
  10. $end = getmicrot

发表评论

电子邮件地址不会被公开。 必填项已用*标注