Está llamando a function_exists () más rápido o más lento que apply_filters ()

4

¿Llamar a function_exists () es más rápido o más lento que apply_filters () ... o la diferencia es tan pequeña que no debería considerarse?

Hice un poco de pruebas basadas en Kaiser y demostró que function_exists () es ~ 3 veces más rápido donde existen tanto la función como el filtro. y ~ 11 veces más rápido si el filtro no existe. No esperaba esto.

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

Tenga en cuenta que esto está ejecutando cada método 1,000,000 veces, lo cual es bastante. Cada método ejecutado una vez se completa muy, muy rápidamente:

Test 1: 0.0000491142
Test 2: 0.0000140667

Concluyo que la diferencia no es un problema.

    
pregunta mfields 24.06.2011 - 16:44

4 respuestas

6

No sé si uno es más rápido o más lento que el otro, pero sugeriría que usar apply_filters() es el enfoque mejor , porque es más limpio , y más intuitivo (en el sentido de hacer las cosas a la "manera de WordPress").

EDIT

Si está realizando pruebas de comparación, ¿no debería comparar el tiempo requerido para ejecutar lo siguiente?

Esto:

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

No es solo el tiempo requerido para verificar la existencia de la función o filtro, sino el tiempo requerido para hacer algo .

    
respondido por el Chip Bennett 24.06.2011 - 16:53
0
  

Descargo de responsabilidad: los números están fuera de una instalación que no es de vainilla, por lo que podría ser menos en ambos lados

WordPress tiene ~ 2.700 funciones y amp; ~ 250 acciones adjuntas en global $wp_filter;

Entonces, la Q podría ser:

  

¿La iteración a través de las funciones existentes (en este punto) es más rápida que la iteración a través de la matriz de filtros enlazados?

Los filtros / ganchos Imo son la forma más rápida, más segura y más fácil de retroceder. Mi elección sería filtros.

    
respondido por el kaiser 24.06.2011 - 18:59
0

Bien, después de ejecutar varias pruebas 1) puedo ver que has_filter tarda ~ 20% más en finalizar (en una instalación no vainilla) 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 es el código que solía probar. Se estableció en la parte superior del archivo functions.php

    
respondido por el kaiser 24.06.2011 - 21:29
0

Estás hablando de micro-optimizaciones aquí. Manténgase en apply_filters, que es más fácil de usar y le permite al usuario final agregar contenido antes o después de la salida de la función si lo desea, sin copiar toda la función si eso es todo lo que quieren hacer. No te preocupes por el posible ahorro de 0.000001 segundos en cualquier cosa. Céntrate siempre en el código limpio, fácil de leer y modular. PHP sigue siendo cada vez más rápido con cada actualización y los sitios de WordPress deberían usar las funciones de almacenamiento en caché de todos modos para devolver el código estático, por lo que la optimización micro es solo una pérdida de tiempo y estrés;)

    
respondido por el WPExplorer 19.02.2018 - 17:57

Lea otras preguntas en las etiquetas