多次调用函数或存储返回值,性能明智

时间:2014-09-30 19:42:35

标签: php performance

在许多WordPress主题和框架中,我找到了以下代码行:

<!--[if lt IE 7]><html <?php language_attributes(); ?> class="no-js lt-ie9 lt-ie8 lt-ie7"><![endif]-->
<!--[if IE 7]><html <?php language_attributes(); ?> class="no-js lt-ie9 lt-ie8"><![endif]-->
<!--[if IE 8]><html <?php language_attributes(); ?> class="no-js lt-ie9"><![endif]-->
<!--[if gt IE 8]><!--> <html <?php language_attributes(); ?> class="no-js"><!--<![endif]-->

我注意到language_attributes()的多次调用,我认为即使是像这样的简单函数也花费了不必要的时间,所以我使用了这段代码:

<?php ob_start(); language_attributes(); $language_attributes = ob_get_clean(); ?>

<!--[if lt IE 7]><html <?php echo $language_attributes; ?> class="no-js lt-ie9 lt-ie8 lt-ie7"><![endif]-->
<!--[if IE 7]><html <?php echo $language_attributes; ?> class="no-js lt-ie9 lt-ie8"><![endif]-->
<!--[if IE 8]><html <?php echo $language_attributes; ?> class="no-js lt-ie9"><![endif]-->
<!--[if gt IE 8]><!--> <html <?php echo $language_attributes; ?> class="no-js"><!--<![endif]-->

<?php unset($language_attributes); ?>

为避免多次调用language_attributes(),但我越是看到第一种模式的使用,我越是怀疑我的决定,所以我决定征求专家意见。

所以,这是我的问题:

在更广泛的方面 - 不限于此特定功能 - 如果函数每次都精确执行

多次调用函数比存储返回值有什么好处?

比如,php中有一些隐藏的缓存机制可以对函数调用进行运行时缓存,所以这样我就不需要存储返回的值了。

2 个答案:

答案 0 :(得分:1)

如果不遵循令人费解的Wordpress代码链(我讨厌Wordpress),就无从知晓。函数的实际调用显然增加了时间,虽然它可能是微不足道的,但在这种情况下,此函数调用至少执行两个其他函数调用。

如果任何函数正在执行任何实质性操作(数据库查询,包括文件,循环,广泛的正则表达式等),那么这可能会导致性能问题。

在一般的最佳实践中,特别是如果您不知道所有功能正在做什么,最好将其称为一次。除非当然有可能在通话中改变/结果,你需要不同的信息。

您可以使用以下方式执行此操作:

$language_attributes = get_bloginfo('language');

或者它是如何工作的:

$language_attributes = str_replace('_', '-', get_locale());

Function Reference/get bloginfo

答案 1 :(得分:1)

尽可能直接回答你的问题,这取决于你。该功能每次都做同样的事情,性能成本是多少?函数是否在不触及存储的情况下缓存/返回一个易于计算的值?是opcached还是运行缓存?所有这些都会影响您对电话会议的决定。

除此之外,还有更多问题要问。你为什么关心这个电话?你有没有测量过它的影响?你测量过更高的谷物了吗?堆栈的其他部分?假设您没有测量任何东西,可能会有更多的优化更有效。

尽管如此,很有可能这是过早的优化,而不是你应该考虑的事情。我推荐The Mature Optimization Handbook,它广泛涵盖了这个主题,并且可以帮助您走上正轨。