关注LAMP|PHP源代码分析|web架构|PHP扩展|Erlang|服务端架构

PHP中Exception性能简单测试及结论

关于是否使用exception风格(个人的说法,也就是非正常的返回值都以抛异常的形式返回)来编码,我产生了一些疑问,经过和同事的一些讨论,我决定做些简单的性能测试。

<?php

/**

 * Exception 简单的性能测试

 * @author Qingliang.Cn  qing.liang.cn@gmail.com

 * @created 2009-11-18 

 * @lastmodified 2009-11-18

 */

define(‘T’1000000);

function no_except($a$b)

{

    if (mt_rand(110) > 0){

        return $a $b;

    }

}

function except($a$b)

{

    try {

        if (mt_rand(110) > 5){ //  0.5的概率抛出异常

            return $a $b;

        }else{

            throw new Exception(1);

        }

    }catch (Exception $e){

        return $e->getMessage();

    }

}

echo "1. with no exception, time is:";

$begin = microtime(true);

for ($i=0$i< T; $i++)

{

    no_except(11);

}

echo microtime(true) - $begin;

echo "\r\n";

echo "2. with exception, time is:";

$begin = microtime(true);

for ($i=0$i< T; $i++)

{

    except(11);

}

echo microtime(true) - $begin;

echo "\r\n";

结果:

100000 (10W)

1. with no exception, time is:3.2554759979248

2. with exception, time is:4.2815051078796

1000000(100W)

1. with no exception, time is:31.89279794693

2. with exception, time is:39.047714948654

上面的测试结果可以看出消耗的时间是相当稳定的,直接的结果是exception比直接return要慢。 

继续分析

抛出异常的概率为0.5,也就是说:50w次的异常处理导致了11秒的性能损失。每次exception处理的消耗大概是 20 微秒,这个消耗是相当的小的。 因为一般情况下,web请求的时间都是ms级别的。

同时这里还有两点需要注意:

1. 没有使用异常的时候,代码中的逻辑判断分值必然会加多,也是一定的消耗。

2. 多数的程序exception命中率不会如上面代码中那么高(50%)。

所以在PHP中应用exception是不需要考虑性能问题的。

如有不同的观点,欢迎拍砖和讨论。 email: qing.liang.cn at gmail.com

返回顶部