如果你看the source for the home_url()
function, 您将注意到最终调用get_option()
. 如中所述this WPSE Answer, 这个get_option()
函数被缓存,这意味着如果选项的值已经在内存中,get_option()
返回该值,而不是再次查询数据库。因此,即使你打电话home_url()
在一次请求期间,它将只查询数据库一次。
记住,Method B (重新使用局部变量的值)仍然比Method A (呼叫home_url()
因为它不会循环调用堆栈上的一系列函数调用。这就是说,考虑到现代PHP的性能,这种差异可以忽略不计,如果不是微秒,那么可以在毫秒数内测量出不同的方法。
简言之Method B 如果只通过一个无穷小的度量,将始终胜过其他解决方案。
附录
根据评论中的要求,我已经为我的服务器环境创建了这两种方法的执行时间概要文件。在这样做的过程中,我创建了附在我答案底部的插件,您可以使用它在自己的环境中测试这些方法。
在我的环境中(Varying Vagrant Vagrants\' wordpress-default
站点-Ubuntu服务器12.04,使用PHP 5.4/MySQL 5.5/Nginx 1.4堆栈),平均100个配置文件,1000个echo()
\'d个实例,我收到以下结果:
方法AGET
字符串:?hup_method=a&hup_profiles=100&hup_instances=1000
方法A echo()在100个配置文件中平均调用1000个home\\u url(),时间为0.023981981277466秒。
方法BGET
字符串:?hup_method=b&hup_profiles=100&hup_instances=1000
方法B echo()在100个概要文件中平均引用1000个$homeUrl,时间为0.00071162700653076秒。
在此配置文件中,Method B 速度大约是Method A, Method B 拥有echo()
\'在0.7毫秒内创建1000个实例,比Method A 管理。这意味着执行对的调用大约需要23微秒(0.000023秒)home_url()
, 和小于0.7微秒(0.0000007秒)的时间$homeUrl
参考(大部分时间可归因于最初调用home_url()
用于Method B).
如果您对代码性能的复杂性非常感兴趣,我建议您花些时间学习;大O符号;或者找一门离散数学计算机科学课程。
<?php
/*
Plugin Name: Home URL Method Profiler
Plugin URI: https://wordpress.stackexchange.com/questions/136091
Description: Using Multiple Queries of “home_url” vs. Calling a Variable Multiple Times
Version: 0.1
Author: Adam Bosco
Author URI: https://wordpress.stackexchange.com/users/25324
License: GPL2
*/
class HomeUrlProfile {
private static $hasPrinted = false; // Only print out the results once
private static $method = NULL; // The method to profile
private static $executionTimes = []; // Profile results.
private static $instanceCount = 1000; // Number of instances of calls to home_url() or uses of $homeUrl to profile against
private static $profileCount = 5; // Number of times to run the same profile
// Constructor; set up action hooks.
public function HomeUrlProfile( $method ) {
self::$method = strtolower( $method );
if( isset( $_GET[ \'hup_instances\' ] ) )
self::$instanceCount = $_GET[ \'hup_instances\' ];
if( isset( $_GET[ \'hup_profiles\' ] ) )
self::$profileCount = $_GET[ \'hup_profiles\' ];
add_action( \'init\', \'HomeUrlProfile::run\' );
add_action( \'loop_start\', \'HomeUrlProfile::printResults\' );
}
// Perform a profile
public static function run() {
// Perform the same profile of a method with the same number of echo()\'d instances $profileCount times
for( $i = 0; $i < self::$profileCount; $i++ ) {
/* For a more realistic scenario, we\'ll actually echo the home URL for each
* iteration. In order to avoid actually displaying all those URLs, we\'ll
* capture the output in a buffer, then discard it after we get our execution
* times. */
ob_start();
// Run the requested method and push the results to the $executionTimes array;
if( self::$method == \'a\' )
array_push( self::$executionTimes, self::methodA() );
else
array_push( self::$executionTimes, self::methodB() );
// Clear the output buffer.
ob_end_clean();
// Remove home_url()\'s cached values after each profile.
wp_cache_delete( \'home\', \'option\' );
wp_cache_delete( \'alloptions\', \'options\' );
}
}
public static function printResults() {
if( self::$hasPrinted )
return;
self::$hasPrinted = true;
$averageTime = array_sum( self::$executionTimes ) / self::$profileCount;
?>
<div>
<h3>Home URL "Method <?php echo strtoupper( self::$method ); ?>" Profile Results</h3>
<p>Averaged across <?php echo self::$profileCount; ?> profiles, Method <?php echo strtoupper( self::$method ); ?> echo()\'d <?php echo self::$instanceCount; echo( self::$method == \'a\' ? \' calls to home_url()\' : \' references to $homeUrl\' ); ?> in <?php echo $averageTime; ?> seconds.</p>
<ol><?php
foreach( self::$executionTimes as $executionTime ) {
echo(\'
<li>\' . $executionTime . \' seconds</li>\');
}
?></ol>
</div>
<?php
}
// "Method A" - using multiple calls to home_url().
public static function methodA() {
// Record the UNIX timestamp as a floating-point value before execution.
$startTime = microtime( true );
for( $i = 0; $i < self::$instanceCount; $i++ ) {
echo( home_url() );
}
// Record the UNIX timestamp after execution
$endTime = microtime( true );
// Return the difference between the timestamps
return $endTime - $startTime;
}
public static function methodB() {
// Record the UNIX timestamp as a floating-point value before execution.
$startTime = microtime( true );
$homeUrl = home_url();
for( $i = 0; $i < $instanceCount; $i++ ) {
echo( $homeUrl );
}
// Record the UNIX timestamp after execution
$endTime = microtime( true );
// Return the difference between the timestamps
return $endTime - $startTime;
}
}
if( ! isset( $HomeUrlProfile ) && isset( $_GET[ \'hup_method\' ] ) ) {
$method = strtolower( $_GET[ \'hup_method\' ] );
switch( $method ) {
case \'a\':
case \'b\':
break;
default:
die( \'Invalid Home URL profiling method specified (must be \\\'A\\\' or \\\'B\\\'): \' . $_GET[ \'hup_method\' ] );
}
$HomeUrlProfile = new HomeUrlProfile( $method );
}
?>
设置
GET
变量
hup_method
将根据指定的值运行方法a或B的配置文件。这个
GET
变量
hup_instances
可用于指定配置文件中方法要回显的主URL数(默认为1000),以及变量
hup_profiles
可用于指定要运行配置文件以创建平均值的次数(默认值为5)。
有多种方法可以使此配置文件更精确(减去执行for
例如,循环),但在它的当前形式中,它给出了有关时间框架的一个非常好的总体概念。
干杯