在PHP if-else结构中保留括号是否可以提高速度?

在PHP if-else结构中保留括号是否可以提高速度?,php,performance,Php,Performance,我正在写一个算法,其中几毫秒的差异确实很重要。我想知道下面的第一个语句是否比下面的第二个语句更快、相等或更慢: if( true ) { return true; } if( true ) return true; 第一项声明: if( true ) { return true; } if( true ) return true; 第二项声明: if( true ) { return true; } if( true ) return t

我正在写一个算法,其中几毫秒的差异确实很重要。我想知道下面的第一个语句是否比下面的第二个语句更快、相等或更慢:

if( true )
{
    return true;
}
if( true )
    return true;
第一项声明:

if( true )
{
    return true;
}
if( true )
    return true;
第二项声明:

if( true )
{
    return true;
}
if( true )
    return true;

有人可能也知道关于速度提高的课程吗?

你应该始终使用括号。没有比去掉括号更好的方法让你的代码变得混乱和难以阅读。据我所知,这两种方式都没有显著的性能影响

这两个额外的键对于阅读你的代码的人来说意味着一个不同的世界

对于这个代码

if( true )
    return true;
echo "Hello World!";
如果你这样做会怎么样

if( true )
   // return true;
echo "Hello World!";

看,有时候它是多么致命。

TL;DR没有括号的速度可能更快,最多可达纳秒/周期,但就不引入错误和复杂性而言,这是一个可怕的想法


作为一个很好的参考,请看。如果且仅当您已经实现了并测试了这些调整中的每一个,您就应该担心这种事情可能会节省纳秒

在认真考虑这种事情之前,你也应该认真考虑实施。code>OpCache将预编译的字节码存储在内存中。只有当编译器尚未在OpCache上下文中对其进行优化时,方括号或无括号调整才相关

此外,正如@Abhineet所说,如果省略括号,代码很快就会变得不可理解

仅仅因为:这里有一个答案。我的基准代码:

// Counting to 10,000,000, without brackets
$i=0;
$start = microtime(true);
while($i < 10000000) {
    if(true)
        $i++;
}
echo "<br>".( (int)((microtime(true) - $start)*1000) )." ms<br/>";

// Counting to 10,000,000, with brackets
$i=0;
$start = microtime(true);
while($i < 10000000) {
    if(true) {
        $i++;
    }
}
echo "<br>".( (int)((microtime(true) - $start)*1000) )." ms<br/>";
//计数到10000000,不带括号
$i=0;
$start=microtime(真);
而($i<10000000){
如果(真)
$i++;
}
回声“
”((int)((微时间(真)-$start)*1000))。“ms
”; //计数为10000000,带括号 $i=0; $start=microtime(真); 而($i<10000000){ 如果(真){ $i++; } } 回声“
”((int)((微时间(真)-$start)*1000))。“ms
”;
在我的戴尔笔记本电脑上,运行Windows 7、Apache/2.2.21和PHP/5.3.9,无括号版本用了2081毫秒,括号版本用了2765毫秒。为了验证,我运行了几次,每次得到的结果都非常接近这些数字。我还改变了测试顺序,得到了类似的结果。但当我在另一个运行PHP5.3.3的系统上运行它时,情况正好相反——括号始终更快。如果您非常关心这一点,那么您将不得不在特定的机器、PHP版本和您打算在生产中使用的配置上广泛地对代码进行基准测试

因此,底线是,您可能能够每1000万次迭代节省大约0.7秒。你想怎么做就怎么做

更新的基准 我又一次偶然发现了这个答案,发现(1)它已经有3.5年的历史了,(2)我的基准是PHP5.3(!)。所以,我决定更新它们。在PHP7+中,这种微优化甚至毫无意义。两个基准:

在PHP7.0.0中,差异小于4%,在1000万次迭代中,不带括号的数字约为355ms,而带括号的数字为368ms。这是每1000万次迭代0.013秒的差异


在PHP7.1.5中,它甚至更荒谬。我得到了1亿次迭代的1326毫秒,而不是1331毫秒。缓存预热后,差异通常小于2毫秒,通常为0毫秒。换句话说,在当前版本的PHP中,省略括号最多可以为每个
if
语句节省0.00000000002秒。在我看来,这还远远不足以证明引入错误并使代码更难阅读的风险。

快速回答:使用PSR-2

这对我来说很有趣,因为不使用它们更快,这里的程序员几乎一致同意“总是使用它们”。然而,当在stripos或regex上烦躁时,他们遵从速度lol。。。两者充其量都有名义收益,因此除非有必要,否则不应被视为优先事项

另一种观点:
我建议您采用PSR2,并严格遵守这些规则(这是必须的)。

如果您真的认为自己已经到了应该关心这种垃圾的地步,那么您的算法会更好。是完美的问题是,我可以放心地保证它们不是。如果你真的在乎,但是……你的计时赛说了什么?我的计时赛波动很大,可以肯定,或者说有差异。所以差异,如果有的话,实际上是如此之小,以至于你测量了它,甚至无法验证它的存在。你为什么还要花时间考虑这个问题?因为我现在正在用一个子集进行测试,而真正的数据集大约要大100倍。完全同意。或者,至少,没有大括号的代码块应该写在一行中,以便作为一条语句阅读,而不可能像您指出的那样出错(行注释)。例如:
if(foo)返回条,或(…)dostuff()的
-1,不回答问题。你的建议应该是一个附加的答案,而不是它的肉。phpbench网站是相当有启发性的!