Está chamando function_exists () mais rápido ou mais devagar que apply_filters ()

4

Está chamando function_exists () mais rápido ou mais devagar que apply_filters () ... ou a diferença é tão pequena que não deve ser considerada?

Eu fiz um pequeno teste baseado no Kaiser e ele mostrou que function_exists () é ~ 3 vezes mais rápido, onde tanto a função quanto o filtro existem. e ~ 11 vezes mais rápido se o filtro não existir. Não estava esperando isso.

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 />' );

Tenha em mente que isso está executando cada método 1.000.000 vezes, o que é bastante. Cada método executado uma vez é concluído muito rapidamente:

Test 1: 0.0000491142
Test 2: 0.0000140667

Gostaria de concluir que a diferença não é um problema.

    
por mfields 24.06.2011 / 16:44

4 respostas

6

Eu não sei se um é mais rápido ou mais lento que o outro, mas eu sugiro que usar apply_filters() é a abordagem melhor , porque é mais limpo e mais intuitivo (no sentido de fazer as coisas do "modo WordPress").

EDITAR

Se você está fazendo testes de comparação, você não deve comparar o tempo necessário para executar o seguinte:

Isto:

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

function taco_party( $salsa = true ) {
    return $salsa;
}
?>

Versus This:

<?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' );
?>

Não é apenas o tempo necessário para verificar a existência da função ou filtro, mas sim o tempo necessário para fazer algo .

    
por Chip Bennett 24.06.2011 / 16:53
0
  

Aviso: os números estão fora de uma instalação não-baunilha, então pode ser menor em ambos os lados

O WordPress tem ~ 2.700 funções & ~ 250 ações anexadas em global $wp_filter;

Assim, o Q poderia ser:

  

A iteração por meio das funções existentes (neste momento) é mais rápida do que percorrer a matriz de filtros conectados?

Os filtros / ganchos Imo são o caminho mais rápido, mais seguro e fácil de rastrear. Minha escolha seria filtros.

    
por kaiser 24.06.2011 / 18:59
0

Ok, depois de executar vários testes 1) , posso ver que has_filter leva ~ 20% mais tempo para terminar (em uma instalação não convencional) do que 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 />');

1) Este é o código que eu usei para testar. Foi colocado no topo do arquivo functions.php

    
por kaiser 24.06.2011 / 21:29
0

Você está falando sobre micro-otimizações aqui. Atenha-se a apply_filters, que é mais fácil de usar e permite que o usuário final também adicione conteúdo antes / depois da saída da função, se quiser, sem copiar toda a função se isso é tudo o que eles querem fazer. Não fique tão preocupado em possivelmente economizar 0,000001 segundos em qualquer coisa. Sempre se concentre em código limpo, fácil de ler e modular. O PHP continua ficando mais rápido a cada atualização e os sites do WordPress devem usar as funções de armazenamento em cache de qualquer maneira para retornar o código estático, de modo que a otimização é apenas uma perda de tempo e estresse;)

    
por WPExplorer 19.02.2018 / 17:57