Skip to content

Instantly share code, notes, and snippets.

@mukeshpanchal27
Created August 26, 2024 05:14
Show Gist options
  • Save mukeshpanchal27/e9e0190881e308ab38ba0b63f6c0cacd to your computer and use it in GitHub Desktop.
Save mukeshpanchal27/e9e0190881e308ab38ba0b63f6c0cacd to your computer and use it in GitHub Desktop.

Benchmark for locate_template

Profile a modified version of locate_template to see if we can speed it up.

See PR WordPress/wordpress-develop#6502

Result: Overall, the new_locate_template() function shows a performance decrease ranging from 29.5% to 109.7% compared to the locate_template() function in most cases.

Average time spent for 1 x 1000 iterations: locate_template() - 2327291 new_locate_template() - 3371709 Change: 44.9%
Average time spent for 1 x 1000 iterations: locate_template() - 4217750 new_locate_template() - 5885542 Change: 39.5%
Average time spent for 1 x 1000 iterations: locate_template() - 2649750 new_locate_template() - 3660833 Change: 38.2%
Average time spent for 1 x 1000 iterations: locate_template() - 4466125 new_locate_template() - 5970000 Change: 33.7%
Average time spent for 1 x 1000 iterations: locate_template() - 2321167 new_locate_template() - 4868625 Change: 109.7%
Average time spent for 1 x 1000 iterations: locate_template() - 3231500 new_locate_template() - 4728166 Change: 46.3%
Average time spent for 1 x 1000 iterations: locate_template() - 2417042 new_locate_template() - 3442250 Change: 42.4%
Average time spent for 1 x 1000 iterations: locate_template() - 3219166 new_locate_template() - 4169375 Change: 29.5%
Average time spent for 1 x 1000 iterations: locate_template() - 2725250 new_locate_template() - 3653625 Change: 34.1%
Average time spent for 1 x 1000 iterations: locate_template() - 2405292 new_locate_template() - 3170375 Change: 31.8%
Average time spent for 1 x 1000 iterations: locate_template() - 2573292 new_locate_template() - 3570792 Change: 38.8%
Average time spent for 1 x 1000 iterations: locate_template() - 2514834 new_locate_template() - 3419583 Change: 36%
Average time spent for 1 x 1000 iterations: locate_template() - 5061292 new_locate_template() - 3319542 Change: -34.4%
Average time spent for 1 x 1000 iterations: locate_template() - 2762333 new_locate_template() - 4013458 Change: 45.3%
Average time spent for 1 x 1000 iterations: locate_template() - 2581125 new_locate_template() - 3664292 Change: 42%
Average time spent for 1 x 1000 iterations: locate_template() - 2170583 new_locate_template() - 3384125 Change: 55.9%
Average time spent for 1 x 1000 iterations: locate_template() - 2738209 new_locate_template() - 3909125 Change: 42.8%
Average time spent for 1 x 1000 iterations: locate_template() - 2437917 new_locate_template() - 4095667 Change: 68%
Average time spent for 1 x 1000 iterations: locate_template() - 3242500 new_locate_template() - 4309958 Change: 32.9%
Average time spent for 1 x 1000 iterations: locate_template() - 4649834 new_locate_template() - 6784333 Change: 45.9%
Average time spent for 1 x 1000 iterations: locate_template() - 2123125 new_locate_template() - 3151250 Change: 48.4%
Average time spent for 1 x 1000 iterations: locate_template() - 2147125 new_locate_template() - 3126417 Change: 45.6%
Average time spent for 1 x 1000 iterations: locate_template() - 2574291 new_locate_template() - 3646625 Change: 41.7%
Average time spent for 1 x 1000 iterations: locate_template() - 2506208 new_locate_template() - 3698250 Change: 47.6%
<?php
// Bootstrapping.
define('WP_USE_THEMES', true);
/** Loads the WordPress Environment and Template */
require ('wp-load.php');
// Setup.
$urls = [
[ 'page.php' ],
[ 'page.php', 'index.php' ],
[ 'header.php' ],
[ 'template-parts/header/site-header.php' ],
[ 'template-parts/header/site-branding.php' ],
[ 'template-parts/header/site-nav.php' ],
[ 'template-parts/content/content-excerpt.php', 'template-parts/content/content.php' ],
[ 'template-parts/header/excerpt-header.php' ],
[ 'template-parts/excerpt/excerpt.php' ],
[ 'footer.php' ],
[ 'template-parts/footer/footer-widgets.php' ],
];
$urls2 = [
[ 'page-2.php' ],
[ 'page-2.php', 'index-2.php' ],
[ 'header-2.php' ],
[ 'template-parts-2/header/site-header.php' ],
[ 'template-parts-2/header/site-branding.php' ],
[ 'template-parts-2/header/site-nav.php' ],
[ 'template-parts-2/content/content-excerpt.php', 'template-parts-2/content/content.php' ],
[ 'template-parts-2/header/excerpt-header.php' ],
[ 'template-parts-2/excerpt/excerpt.php' ],
[ 'footer-2.php' ],
[ 'template-parts-2/footer/footer-widgets.php' ],
];
$repetitions = 1;
$iterations = 1000;
$stringcount = count( $urls );
// Refactoring functions.
function new_locate_template( $template_names, $load = false, $load_once = true, $args = array() ) {
global $wp_stylesheet_path, $wp_template_path;
if ( ! isset( $wp_stylesheet_path ) || ! isset( $wp_template_path ) ) {
wp_set_template_globals();
}
$is_child_theme = is_child_theme();
$located = '';
foreach ( (array) $template_names as $template_name ) {
if ( ! $template_name ) {
continue;
}
$stylesheet = $wp_stylesheet_path . '/' . $template_name;
$template = $wp_template_path . '/' . $template_name;
$template_compat = ABSPATH . WPINC . '/theme-compat/' . $template_name;
if ( file_exists( $stylesheet ) && 0 === validate_file( $stylesheet ) ) {
$located = $stylesheet;
break;
} elseif ( $is_child_theme && file_exists( $template ) && 0 === validate_file( $template ) ) {
$located = $template;
break;
} elseif ( file_exists( $template_compat ) && 0 === validate_file( $template_compat ) ) {
$located = $template_compat;
}
}
if ( $load && '' !== $located ) {
load_template( $located, $load_once, $args );
}
return $located;
}
// Profiling.
for ( $repetition = 0; $repetition <= $repetitions; $repetition ++ ) {
if( $repetition == 0 ) {
continue;
}
$time_start = hrtime( true );
for ( $index = 0; $index < $iterations; $index ++ ) {
$url = $urls[ $index % $stringcount ];
$result = locate_template( $url );
}
$time_end = hrtime( true );
$locate_template_time[ $repetition ] = $time_end - $time_start;
$time_start = hrtime( true );
for ( $index = 0; $index < $iterations; $index ++ ) {
$url = $urls2[ $index % $stringcount ];
$result = new_locate_template( $url );
}
$time_end = hrtime( true );
$new_locate_template_time[ $repetition ] = $time_end - $time_start;
}
$locate_template_time_avg = array_sum( $locate_template_time ) / $repetitions;
$new_locate_template_time_avg = array_sum( $new_locate_template_time ) / $repetitions;
$percentage = round( $new_locate_template_time_avg / $locate_template_time_avg * 100, 1 ) - 100;
printf( "Average time spent for {$repetitions} x {$iterations} iterations:\n locate_template() - {$locate_template_time_avg}\nnew_locate_template() - {$new_locate_template_time_avg}\n\nChange: {$percentage}%%\n" );
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment