PHP if语句的性能差异条件
PHP performance difference conditions of if statement
嘿,有人知道这两个代码 (PHP-7) 之间是否存在任何性能差异吗:
public function isActive() : bool
{
if ($cond1) {
if ($cond2) {
return true;
}
}
return false;
}
和
public function isActive() : bool
{
if ($cond1 && $cond2) {
return true;
}
return false;
}
(是的,我知道变量没有定义,问题是关于 if 语句而不是变量)
我问这个问题是因为我专注于我的代码的可读性,但同时我会尽我所能保持我的性能。
即使只是非常微小的性能差异(例如 0.000000001%),我仍然想知道答案。
嗯,这是一个 "answer",但实际上,这并不重要。
方法一
<?php
$temp = 10000;
function isActive() {
if ($cond1) {
if ($cond2) {
return true;
}
}
return false;
}
$start = microtime(true);
while ($temp) {
isActive();
$temp--;
}
echo $time_elapsed_secs = microtime(true) - $start;
?>
输出:0.17261600494385
方法二
<?php
$temp = 10000;
function isActive() {
if ($cond1 && $cond2) {
return true;
}
return false;
}
$start = microtime(true);
while ($temp) {
isActive();
$temp--;
}
echo $time_elapsed_secs = microtime(true) - $start;
?>
输出:0.16869401931763
注意:我得到了一系列输出,有些输出比彼此高一些,有些低一些。你得到的平均值可能是不同的时间并且可以忽略不计,你真的不用担心,选择你最喜欢的方法。
我知道@tom 以 "it doesn't matter" 开始他的回答,但这还不够强调,所以我将在一个单独的回答中进一步详细说明。
@piotr-gajdowski:不用担心这种事情。如果需要循环数千次才能看到差异,这意味着这是一种微优化的情况。这里的差异将在同时进行的任何其他考虑的背景噪音中丢失,例如:
- 当时服务器还在做什么;
- 网络延迟变化;
- 当时数据库等外部依赖项有多忙。
所以...根本没关系。
始终选择您认为最清晰的代码,而且 - 更重要的是 - 其他人 会找到最清晰的代码。这通常意味着最简单的。
对于您的具体情况,鉴于您给了我们 "fake" 代码,甚至不可能根据您的示例说出它可能是什么:
- 这两个条件有多复杂?
- 它们真的只是单个变量吗?
- 变量有解释性名称吗?
- 如果它们的条件实际上是布尔表达式而不是变量...请考虑将它们放入 命名良好的中间变量中。
这些是您应该担心的事情。
尽可能清楚地编写您的代码(顺便说一句,这并不一定意味着尽可能简洁)。如果在某个时候你发现你有性能问题,然后(并且只有那时)开始寻找优化。但是不要开始寻找这种优化。开始寻找会有所作为的东西。
我认为您可以对您的代码示例做的最好的事情是将真实世界的代码提交给 Code Review,然后我们可以帮助您想出最清晰的编码方法。这是你应该在这里问的问题。
嘿,有人知道这两个代码 (PHP-7) 之间是否存在任何性能差异吗:
public function isActive() : bool
{
if ($cond1) {
if ($cond2) {
return true;
}
}
return false;
}
和
public function isActive() : bool
{
if ($cond1 && $cond2) {
return true;
}
return false;
}
(是的,我知道变量没有定义,问题是关于 if 语句而不是变量)
我问这个问题是因为我专注于我的代码的可读性,但同时我会尽我所能保持我的性能。
即使只是非常微小的性能差异(例如 0.000000001%),我仍然想知道答案。
嗯,这是一个 "answer",但实际上,这并不重要。
方法一
<?php
$temp = 10000;
function isActive() {
if ($cond1) {
if ($cond2) {
return true;
}
}
return false;
}
$start = microtime(true);
while ($temp) {
isActive();
$temp--;
}
echo $time_elapsed_secs = microtime(true) - $start;
?>
输出:0.17261600494385
方法二
<?php
$temp = 10000;
function isActive() {
if ($cond1 && $cond2) {
return true;
}
return false;
}
$start = microtime(true);
while ($temp) {
isActive();
$temp--;
}
echo $time_elapsed_secs = microtime(true) - $start;
?>
输出:0.16869401931763
注意:我得到了一系列输出,有些输出比彼此高一些,有些低一些。你得到的平均值可能是不同的时间并且可以忽略不计,你真的不用担心,选择你最喜欢的方法。
我知道@tom 以 "it doesn't matter" 开始他的回答,但这还不够强调,所以我将在一个单独的回答中进一步详细说明。
@piotr-gajdowski:不用担心这种事情。如果需要循环数千次才能看到差异,这意味着这是一种微优化的情况。这里的差异将在同时进行的任何其他考虑的背景噪音中丢失,例如:
- 当时服务器还在做什么;
- 网络延迟变化;
- 当时数据库等外部依赖项有多忙。
所以...根本没关系。
始终选择您认为最清晰的代码,而且 - 更重要的是 - 其他人 会找到最清晰的代码。这通常意味着最简单的。
对于您的具体情况,鉴于您给了我们 "fake" 代码,甚至不可能根据您的示例说出它可能是什么:
- 这两个条件有多复杂?
- 它们真的只是单个变量吗?
- 变量有解释性名称吗?
- 如果它们的条件实际上是布尔表达式而不是变量...请考虑将它们放入 命名良好的中间变量中。
这些是您应该担心的事情。
尽可能清楚地编写您的代码(顺便说一句,这并不一定意味着尽可能简洁)。如果在某个时候你发现你有性能问题,然后(并且只有那时)开始寻找优化。但是不要开始寻找这种优化。开始寻找会有所作为的东西。
我认为您可以对您的代码示例做的最好的事情是将真实世界的代码提交给 Code Review,然后我们可以帮助您想出最清晰的编码方法。这是你应该在这里问的问题。