Profile a modified version of locate_template to see if we can speed it up.
This is used to benchmark the patch introduced for Trac ticket #40731.
Results of the benchmark are found in a shared Google Sheet.
Profile a modified version of locate_template to see if we can speed it up.
This is used to benchmark the patch introduced for Trac ticket #40731.
Results of the benchmark are found in a shared Google Sheet.
| <?php | |
| // Bootstrapping. | |
| define('WP_USE_THEMES', true); | |
| /** Loads the WordPress Environment and Template */ | |
| require ('wp-load.php'); | |
| // Setup. | |
| $urls = [ | |
| [ 'front-page.php' ], | |
| [ 'home.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 = [ | |
| [ 'front-page-2.php' ], | |
| [ 'home-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 = 10; | |
| $iterations = 11; | |
| $stringcount = count( $urls ); | |
| function microtime_float() { | |
| list( $usec, $sec ) = explode( ' ', microtime() ); | |
| return ( (float) $usec + (float) $sec ); | |
| } | |
| // Refactoring functions. | |
| function new_locate_template( $template_names, $load = false, $require_once = true, $args = array() ) { | |
| $located = ''; | |
| static $template_cache = array(); | |
| foreach ( (array) $template_names as $template_name ) { | |
| if ( ! $template_name ) { | |
| continue; | |
| } | |
| if ( isset( $template_cache[ $template_name ] ) ) { | |
| if ( '' === $template_cache[ $template_name ] ) { | |
| continue; | |
| } | |
| $located = $template_cache[ $template_name ]; | |
| break; | |
| } | |
| if ( file_exists( STYLESHEETPATH . '/' . $template_name ) ) { | |
| $located = $template_cache[$template_name] = STYLESHEETPATH . '/' . $template_name; | |
| break; | |
| } elseif ( file_exists( TEMPLATEPATH . '/' . $template_name ) ) { | |
| $located = $template_cache[$template_name] = TEMPLATEPATH . '/' . $template_name; | |
| break; | |
| } elseif ( file_exists( ABSPATH . WPINC . '/theme-compat/' . $template_name ) ) { | |
| $located = $template_cache[$template_name] = ABSPATH . WPINC . '/theme-compat/' . $template_name; | |
| break; | |
| } | |
| $template_cache[$template_name] = ''; | |
| } | |
| if ( $load && '' !== $located ) { | |
| load_template( $located, $require_once, $args ); | |
| } | |
| return $located; | |
| } | |
| // Profiling. | |
| for ( $repetition = 0; $repetition <= $repetitions; $repetition ++ ) { | |
| if( $repetition == 0 ) { | |
| continue; | |
| } | |
| $time_start = microtime_float(); | |
| for ( $index = 0; $index < $iterations; $index ++ ) { | |
| $url = $urls[ $index % $stringcount ]; | |
| $result = locate_template( $url ); | |
| } | |
| $time_end = microtime_float(); | |
| $locate_template_time[ $repetition ] = $time_end - $time_start; | |
| $time_start = microtime_float(); | |
| for ( $index = 0; $index < $iterations; $index ++ ) { | |
| $url = $urls2[ $index % $stringcount ]; | |
| $result = new_locate_template( $url ); | |
| } | |
| $time_end = microtime_float(); | |
| $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" ); |