调用Function_Exist()比调用Apply_Filters()快还是慢

时间:2011-06-24 作者:mfields

调用函数\\u exists()时,应用\\u filters()的速度是快还是慢。。。还是差异太小,不应该考虑?

我在Kaiser的基础上做了一些测试,结果表明,在同时存在函数和过滤器的情况下,function\\u exists()的速度大约是3倍。如果过滤器不存在,速度将提高约11倍。没想到会这样。

function taco_party() {
    return true;
}

add_filter( \'taco-party\', \'taco_party\' );

timer_start();
for ( $i = 0; $i < 1000000; $i++ )  {
    $test = apply_filters( \'taco-party\', \'\' );
}
echo( \'Seconds: \' . timer_stop( 0, 10 ) . \'<br />\' );

timer_start();
for ( $i = 0; $i < 1000000; $i++ )  {
    if ( function_exists( \'taco_party\' ) ) {
        $test = taco_party();
    }
}
echo( \'Seconds: \' . timer_stop( 0, 10 ) . \'<br />\' );
请记住,每个方法运行1000000次,这是相当多的。每运行一次的方法都会非常、非常快地完成:

Test 1: 0.0000491142
Test 2: 0.0000140667
我的结论是,差异不是问题。

4 个回复
SO网友:Chip Bennett

我不知道一个比另一个快还是慢,但我建议使用apply_filters() 是更好的方法,因为它更干净,更直观(从“WordPress方式”的意义上来说)。

EDIT

如果您正在进行比较测试,是否应该比较执行以下操作所需的时间:

这是:

<?php
if ( ! function_exists( \'taco_party\' ) ) {
    function taco_party( $salsa = true ) {
        return $salsa;
    }
}

function taco_party( $salsa = true ) {
    return $salsa;
}
?>
与此相比:

<?php
function taco_party( $salsa = true ) {
    return apply_filters( \'taco-party\', $salsa );
}
function hot_salsa() {
    $salsa = true;
    return $salsa;
}
add_filter( \'taco-party\', \'hot_salsa\' );
?>
这不仅仅是检查函数或过滤器是否存在所需的时间,而是做某事所需的时间。

SO网友:kaiser

免责声明:这些数字是非常规安装的,因此两侧的安装可能会更少

WordPress有2.700个功能250附加操作global $wp_filter;

所以Q可以是:

迭代(此时)现有函数是否比迭代挂钩过滤器数组更快?

Imo过滤器/挂钩是更快、更安全和更容易回溯的方式。我会选择过滤器。

SO网友:kaiser

好的,在运行了几个测试之后,我可以看到has_filter 完成(非常规安装)所需时间比function_exists:

// You have to uncomment one or the other to run the test
// don\'t run timer_xy() functions behind each other - the result is then wrong
timer_start();
$output = \' false \';
for ( $i = 0; $i < 1000000; $i++ ) 
{
    // if ( function_exists(\'wp_login\') ) $output = \' true \';
    if ( has_filter( \'shutdown\' ) ) $output = \' true \';
}
echo $output;
echo(\'Seconds: \' . timer_stop(0,10) . \'<br />\');
这是我用来测试的代码。它被设置在函数的顶部。php文件

SO网友:WPExplorer

您在这里谈论的是微观优化。坚持使用易于使用的apply\\u filters,允许最终用户在您的函数输出之前/之后添加内容(如果他们想这样做的话),而无需复制整个函数。不要太担心在任何事情上可能节省0.000001秒。始终关注干净、易于阅读和模块化的代码。PHP每次更新都会变得越来越快,WordPress网站无论如何都应该使用缓存功能来返回静态代码,所以微观优化只是浪费时间和压力;)

结束

相关推荐

hooks & filters and variables

我是updating the codex page example for action hooks, 在游戏中完成一些可重用的功能(最初是针对这里的一些Q@WA)。但后来我遇到了一个以前没有意识到的问题:在挂接到一个函数以修改变量的输出后,我再也无法决定是要回显输出还是只返回它。The Problem: 我可以修改传递给do_action 用回调函数钩住。使用变量修改/添加的所有内容仅在回调函数中可用,但在do_action 在原始函数内部调用。很高兴:我将其修改为一个工作示例,因此您可以将其复制/粘贴