【问题标题】:if else statement order, always most often true statement first? How much performance improvement?if else 语句顺序,总是最常见的正确语句在前?性能提升多少?
【发布时间】:2019-06-24 18:37:13
【问题描述】:

我有一个关于 PHP/if / elseif / else 语句顺序的一般性能差异的问题。 首先按照最常见的正确语句的顺序运行 if / elseif / else 语句以减少检查以提高性能是有意义的。

现在我的问题是,没有 elseif 的简单 if/else 语句呢? 如果语句 if 为 false 并且它跳转到 else 情况,它实际上没有检查任何东西,因为它是默认值,这有什么不同吗?或者通过跳转到 else 而不是在 if 语句内是否还增加了运行时的额外时间?如果是这样,它会产生多大的影响?

编辑:

@MonkeyZeus 感谢这个词。

是的,这就是我的意思的一部分。但在这种情况下:

if(x>10) {y = 10}
else {y = 0}
//or
if(x!>10) {y = 0}
else {y = 10}

如果它跳转到 else 是否有区别,因为它总是检查一个语句?因此,如果让我们说案例 1 更频繁地发生,我会走那条路,如果案例 2 更频繁地发生,我会使用代码走这条路。结果是一样的,但在一种情况下,它在 if 情况下跳跃 80% 的时间,在另一种情况下,在 else 情况下跳跃 80%。

【问题讨论】:

  • 一个 CPU 滴答声或多或少不会产生影响,但如果您的条件或代码块中有大量 CPU 操作,那么您需要考虑何时执行。
  • 如果有任何差异,它永远不会对您的应用程序产生任何可衡量的影响。如果您想提高性能,请运行分析器以查看您的瓶颈实际在哪里。
  • 如果$x 更频繁地为假,您将按比较顺序看到它:if(someSlowFunc() && $x)if($x && someSlowFunc()) 慢,因为如果$x 为假,func 将不会运行。
  • 好吧,我知道在一次调用中它没有太大区别,但是如果我得到一个包含 10000 次调用的循环,那么 0.01 毫秒会产生影响。
  • 您正在寻找“短路评估”,是的,根据迭代次数,绝对可以获得性能优势。 en.wikipedia.org/wiki/Short-circuit_evaluation。这不仅仅是跳入else{} 的问题,if(){} 内部的比较顺序也会产生很大的影响。

标签: php performance optimization


【解决方案1】:

正如其他人所说,从实践的角度来看,正确的基准测试是您了解的最佳方式。但理论上,您的示例(或任何 if else 示例)之间应该没有任何区别,因为在许多代码执行优化中,其中之一是 branch prediction。这将确保在通过 if 的同一分支的行中给定足够的迭代,执行将开始预测进一步的迭代也将通过该分支并开始预执行其中的代码。

至于 else if 情况,我不完全确定,但我认为如果对每一行代码都进行缓存预测,情况类似。

【讨论】:

    【解决方案2】:

    归根结底,您只是在问“请为我做基准测试。”

    所以你去:

    PHP 7.3.5 @http://sandbox.onlinephpfunctions.com/

    <?php
    $x = 1;
    $iterations = 10000000; // 10 million
    
    $start = microtime(true);
    for( $i = 0; $i < $iterations; ++$i )
    {
    }
    echo microtime(true) - $start; // 0.071332216262817 seconds
    echo PHP_EOL;
    
    $start = microtime(true);
    for( $i = 0; $i < $iterations; ++$i )
    {
        if( $x < 10 ){}
    }
    echo microtime(true) - $start; // 0.10689616203308 seconds
    

    处理不需要的 if(){} 需要多 40% 的时间

    【讨论】:

    • 我认为问题不在于是否拥有if。更多的是关于 ifelse 块的内容顺序是否重要。
    • 感谢您提供该网站/代码。是的,正如帕特里克所说,这个问题有点不同,但接近答案。我测试了 100% if = true 和 100% else 之间的差异,结果差异约为 5%。谢谢。
    • 也许这个基准可以回答更多问题:3v4l.org/8tOV2 ...真假条件没有区别。
    • @PatrickQ 答案仍然存在:BENCHMARK IT。 PHP 版本之间甚至可能在 CPU 之间会有所不同。差异可能可以忽略不计,可读性应该是更高的优先级。
    • @DappFuture 我理解您的问题的前提,但不知道您正在构建什么样的应用程序,几乎不可能正确回答您的问题。经过 1000 万次迭代后,我的示例中的差异实际上可以忽略不计。您可以进行基准测试并继续前进。 microtime(true) 是我回答中唯一有用的信息,因为其余信息始终是用户和环境特定的。此外,++$i 是一些众所周知的低挂优化成果;不要使用$i++
    猜你喜欢
    • 2023-03-25
    • 2017-09-11
    • 1970-01-01
    • 1970-01-01
    • 2018-09-23
    • 1970-01-01
    • 2023-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多