首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP 5反射API性能

PHP 5反射API性能
EN

Stack Overflow用户
提问于 2008-11-16 23:41:59
回答 10查看 24.5K关注 0票数 60

我目前正在考虑在我自己的MVC框架中使用反射类(主要是ReflectionClass和ReflectionMethod ),因为我需要自动实例化控制器类并调用它们的方法,而不需要任何必要的配置(“约定重于配置”方法)。

我担心性能,尽管我认为数据库请求可能比实际的PHP代码更大的瓶颈。

所以,我想知道是否有人从性能的角度对PHP5反射有好的或坏的体验。

此外,我很好奇是否有流行的PHP框架(CI、Cake、Symfony等)。实际使用反射。

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2008-11-16 23:43:45

不要担心。安装Xdebug并确保瓶颈所在。

使用反射是有成本的,但这是否重要取决于您正在做什么。如果您使用反射实现控制器/请求分派器,则每个请求只使用一次。绝对可以忽略不计。

如果您使用反射实现您的ORM层,将它用于每个对象,甚至每个对属性的访问,并创建成百上千个对象,那么它的成本可能会很高。

票数 57
EN

Stack Overflow用户

发布于 2013-02-02 03:45:49

我对这3个选项进行了基准测试(另一个基准测试没有划分CPU周期,而且是4年前的):

代码语言:javascript
复制
class foo {
    public static function bar() {
        return __METHOD__;
    }
}

function directCall() {
    return foo::bar($_SERVER['REQUEST_TIME']);
}

function variableCall() {
    return call_user_func(array('foo', 'bar'), $_SERVER['REQUEST_TIME']);
}

function reflectedCall() {
    return (new ReflectionMethod('foo', 'bar'))->invoke(null, $_SERVER['REQUEST_TIME']);
}

1,000,000次迭代所用的绝对时间:

基准测试(

(print_r(‘directCall’,'variableCall','reflectedCall'),1000000));

代码语言:javascript
复制
Array
(
    [directCall] => 4.13348770
    [variableCall] => 6.82747173
    [reflectedCall] => 8.67534351
)

以及相对时间,也有1,000,000次迭代(单独运行):

ph()->Dump(Benchmark(数组(‘directCall’,'variableCall','reflectedCall'),1000000,true));

代码语言:javascript
复制
Array
(
    [directCall] => 1.00000000
    [variableCall] => 1.67164707
    [reflectedCall] => 2.13174915
)

在5.4.7中,反射性能似乎有了很大提高(从~500%下降到~213%)。

如果有人想重新运行这个基准测试,下面是我使用的Benchmark()函数:

代码语言:javascript
复制
function Benchmark($callbacks, $iterations = 100, $relative = false)
{
    set_time_limit(0);

    if (count($callbacks = array_filter((array) $callbacks, 'is_callable')) > 0)
    {
        $result = array_fill_keys($callbacks, 0);
        $arguments = array_slice(func_get_args(), 3);

        for ($i = 0; $i < $iterations; ++$i)
        {
            foreach ($result as $key => $value)
            {
                $value = microtime(true);
                call_user_func_array($key, $arguments);
                $result[$key] += microtime(true) - $value;
            }
        }

        asort($result, SORT_NUMERIC);

        foreach (array_reverse($result) as $key => $value)
        {
            if ($relative === true)
            {
                $value /= reset($result);
            }

            $result[$key] = number_format($value, 8, '.', '');
        }

        return $result;
    }

    return false;
}
票数 58
EN

Stack Overflow用户

发布于 2009-05-30 08:48:43

在我的机器上,调用一个静态函数一百万次将花费大约0.31秒。当使用ReflectionMethod时,大约需要1.82秒。这意味着使用反射API的成本要高出约500%。

顺便说一下,这是我使用的代码:

代码语言:javascript
复制
<?PHP

class test
{
    static function f(){
            return;
    }
}

$s = microtime(true);
for ($i=0; $i<1000000; $i++)
{
    test::f('x');
}
echo ($a=microtime(true) - $s)."\n";

$s = microtime(true);
for ($i=0; $i<1000000; $i++)
{
    $rm = new ReflectionMethod('test', 'f');
    $rm->invokeArgs(null, array('f'));
}

echo ($b=microtime(true) - $s)."\n";

echo 100/$a*$b;

显然,实际的影响取决于您期望执行的调用次数

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/294582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档