Php 在else块内设置变量两次或一次是否更昂贵?

Php 在else块内设置变量两次或一次是否更昂贵?,php,Php,设置变量两次 $var = 2; if ($someThing) { $var = 1; } if ($someThing) { $var = 1; } else { $var = 2; } VS 使用else $var = 2; if ($someThing) { $var = 1; } if ($someThing) { $var = 1; } else { $var = 2; } 我知道在这两种情况下,$someThing都会得到评估

设置变量两次

$var = 2;
if ($someThing) {
    $var = 1;
}
if ($someThing) {
    $var = 1;
}
else {
    $var = 2;
}
VS

使用else

$var = 2;
if ($someThing) {
    $var = 1;
}
if ($someThing) {
    $var = 1;
}
else {
    $var = 2;
}
我知道在这两种情况下,
$someThing
都会得到评估<代码>$var也将在这两种情况下设置。在前一种情况下,设置一次,然后有50/50的机会再次设置。后者只设置一次,但有一个else块


我只是好奇是否有人做过类似的测试。我知道这确实是一个微观优化,但只是我的一个随机想法。

这不是关于是否实现了
$someThing
,而是关于机器必须做出的努力。让我们看看:

$var = 2;
if ($someThing) {
    $var = 1;
}
指最少1次分配和1次检查,最多2次分配和1次检查

if ($someThing) {
    $var = 1;
}
else {
    $var = 2;
}
指最少1次分配和1次检查,最多1次分配和1次检查

if ($someThing) {
    $var = 1;
}
else {
    $var = 2;
}
else
是最佳选择


注意:如果
$someThing
依赖于这段代码之外的
$var
,并且它被反复调用,并且希望绝对确保您的代码是最佳的,那么您必须执行一个不太琐碎的操作。

您可以使用Vulcan逻辑转储查看每个选项的操作码步骤

  • 并且还使用

编辑


正如Barmar所指出的,并不是所有的方法都执行所有的步骤,因为这里有跳跃,并且也不是所有的步骤都有相同的处理成本,你必须在汇编中想象,这可能会根据架构的不同而有所不同

以下是一些基本伪代码:

write $var 2
bne $something x
write $var 1
x:


第一个有时有一个额外的写操作。第二个有时有一个额外的跳转指令。我认为跳转指令会更快,分支预测将允许它在引擎罩下进一步优化,因此我选择第二个选项。

编写它的更简单方法是
$var=$something?1 : 2;@barmar Yea,我知道。这只是我写的一个简单的用例。在I/EL块中可能有更多的逻辑,更多的赋值等等。我会认为这是“无用的”,所以我否决了它。考虑到一些“无用的”,你本质上是在控制人们的好奇心。我个人永远不会用“费用”来决定使用哪一个结构,这对我来说是“有用的”。所有不同意的人都应该投票,这就是这个制度的价值所在。谢谢!用这些词来表达比我描述的更有意义。根据那些废话,后面的看起来更昂贵,因为有5次操作和4次操作。@VitaliyIsikov,但其中一些因为跳跃而被跳过。项目符号列表中的代码需要额外的缩进。啊,明白了,谢谢;一个要记住的未来。。。。总是有一些新的东西需要学习,因为比较操作码指令的长度有助于优化操作码没有要求的程序长度,所以在没有解释的情况下,不会告诉您哪些代码更快。我看不出看操作码(以及这个和其他答案)有什么意义!很难说一个语句是否比另一个语句快,因为PHP是一种解释语言。您需要了解操作系统及其运行的硬件才能做出这样的声明。
bne $something x
write $var 1
jmp y:
x:
write $var 2
y: