【问题标题】:PHP performance difference conditions of if statement [closed]if语句的PHP性能差异条件[关闭]
【发布时间】:2016-07-15 06:23:52
【问题描述】:

嘿,快速提问,任何人都知道这两个代码(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%),我仍然想知道答案。

【问题讨论】:

  • 逻辑上它们是相同的。为什么不搭建一个测试环境,测试一下?
  • 可能会有差异,但完全无关紧要。换句话说,它不会对你的表现产生任何影响。您应该编写代码,使其可读且有意义。更简单的方法是:return $cond1 && $cond2;
  • 自己做基准测试,微优化不适合堆栈溢出问题
  • 它们是一样的。我通常使用第二个,因为它使您的代码简短且看起来不错。

标签: php if-statement conditional conditional-statements php-7


【解决方案1】:

我知道@tom 以“没关系”开始他的回答,但这不能强调足够,所以我将在单独的答案中进一步详细说明。

@piotr-gajdowski:别担心这类事情。如果需要循环数千次才能看到差异,这意味着这是一种微优化的情况。此处的差异将消失在同时进行的任何其他考虑的背景噪音中,例如:

  • 当时服务器还在做什么;
  • 网络延迟变化;
  • 当时像 DB 这样的外部依赖项有多忙。

所以……这根本不重要。

始终选择您认为最清晰的代码,并且 - 更重要的是 - 其他人会发现最清晰的代码。这通常意味着最简单。

对于您的具体情况,鉴于您给了我们“假”代码,甚至不可能根据您的示例说出它可能是什么:

  • 这两个条件有多复杂?
  • 它们真的只是单个变量吗?
  • 变量是否有解释性名称?
  • 如果它们的条件实际上是布尔表达式而不是变量...考虑将它们放入命名良好的中间变量中。

这些是你应该担心的事情。

尽可能清楚地编写代码(这并不一定意味着尽可能简洁,顺便说一句)。如果在某个时候您发现自己有性能问题,然后(并且只有在那时)开始寻找优化。但不要开始寻找这种优化。开始寻找能够带来改变的事物。

我认为您可以对代码示例做的最好的事情是将真实世界的代码提交给Code Review,然后我们可以帮助您想出最清晰的编码方法。这就是你应该在这里问的问题。

【讨论】:

    【解决方案2】:

    嗯,这是一个“答案”,但实际上,当它归结为它时,没关系

    方法一

    <?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

    注意:我得到了一系列的输出,这些输出比彼此更高和更低。你得到的平均值可能是不同的时间,而且可以忽略不计,你真的不用担心,选择你最喜欢的方法。

    【讨论】:

      猜你喜欢
      • 2013-09-01
      • 1970-01-01
      • 2013-12-08
      • 1970-01-01
      • 2016-09-07
      • 2021-09-18
      • 2017-10-03
      • 2019-09-21
      • 2018-02-22
      相关资源
      最近更新 更多