it-swarm.com.de

Ruft function_exists () schneller oder langsamer auf als apply_filters ()?

Ruft function_exists () schneller oder langsamer auf als apply_filters () ... oder ist der Unterschied so gering, dass er nicht berücksichtigt werden sollte?

Ich habe ein paar Tests durchgeführt, die auf Kaisers basieren, und es hat sich gezeigt, dass function_exists () ~ 3-mal schneller ist, wenn sowohl die Funktion als auch der Filter vorhanden sind. und ~ 11 mal schneller, wenn der Filter nicht existiert. Habe das nicht erwartet.

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

Denken Sie daran, dass jede Methode 1.000.000 Mal ausgeführt wird, was ziemlich viel ist. Jede Methode, die einmal ausgeführt wurde, ist sehr, sehr schnell abgeschlossen:

Test 1: 0.0000491142
Test 2: 0.0000140667

Ich würde daraus schließen, dass der Unterschied kein Thema ist.

4
mfields

Ich weiß nicht, ob einer schneller oder langsamer als der andere ist, aber ich würde vorschlagen, dass die Verwendung von apply_filters() der bessere Ansatz ist, da er sauberer ist und intuitiver (im Sinne von "WordPress").

EDIT

Wenn Sie Vergleichstests durchführen, sollten Sie nicht die Zeit vergleichen, die erforderlich ist, um Folgendes auszuführen:

Diese:

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

Es ist nicht nur die Zeit, die erforderlich ist, um zu überprüfen, ob die Funktion oder der Filter vorhanden ist , sondern auch die Zeit, die erforderlich ist, um etwas zu tun .

6
Chip Bennett

Sie sprechen hier von Mikrooptimierungen. Halten Sie sich an apply_filters, das einfacher zu verwenden ist und es dem Endbenutzer ermöglicht, Inhalte vor/nach Ihrer Funktionsausgabe hinzuzufügen, wenn er dies wünscht, ohne die gesamte Funktion zu kopieren, wenn dies alles ist, was er tun möchte. Seien Sie nicht so besorgt darüber, möglicherweise 0,000001 Sekunden bei irgendetwas zu sparen. Konzentrieren Sie sich immer auf sauberen, leicht lesbaren und modularen Code. PHP wird mit jedem Update schneller und WordPress-Sites sollten ohnehin Caching-Funktionen verwenden, um statischen Code zurückzugeben, so dass die Mikrooptimierung nur eine Verschwendung von Zeit und Stress ist;)

0
WPExplorer

Haftungsausschluss: Die Zahlen stammen aus einer Nicht-Vanilla-Installation, daher könnte es auf beiden Seiten weniger sein

WordPress hat ~ 2.700 Funktionen & ~ 250 Aktionen in global $wp_filter; angehängt

Das Q könnte also sein:

Durchlaufen Sie die (zu diesem Zeitpunkt) vorhandenen Funktionen schneller als das Array von Hook-Filtern?

Imo Filter/Hooks sind der schnellere Weg, sicherer und einfacher zurückzuverfolgen. Ich würde Filter wählen.

0
kaiser

Ok, nach mehreren Tests1) Ich kann feststellen, dass das Beenden von has_filter ~ 20% mehr Zeit in Anspruch nimmt (bei einer Nicht-Vanilla-Installation) als 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) Dies ist der Code, den ich zum Testen verwendet habe. Es wurde am Anfang der Datei functions.php gesetzt

0
kaiser