[英]Is it more expensive to set a variable twice or once but inside an else block?
兩次設置變量
$var = 2;
if ($someThing) {
$var = 1;
}
VS
使用其他
if ($someThing) {
$var = 1;
}
else {
$var = 2;
}
我知道$someThing
在兩種情況下都會得到評估。 在兩種情況下都將設置$var
。 在前者中,它被設置為一次,然后有50/50的機會再次被設置。 以后只設置一次,但是還有一個else塊。
我只是好奇是否有人進行過類似的測試。 我知道這確實是微優化,但只是我的一個隨機想法。
您可以使用Vulcan Logic Dump查看每個選項的操作碼步驟
compiled vars: !0 = $var, !1 = $someThing line #* EIO op fetch ext return operands ------------------------------------------------------------------------------------- 3 0 E > ASSIGN !0, 2 4 1 > JMPZ !1, ->3 5 2 > ASSIGN !0, 1 3 > > RETURN 1
compiled vars: !0 = $someThing, !1 = $var line #* EIO op fetch ext return operands ------------------------------------------------------------------------------------- 3 0 E > > JMPZ !0, ->3 4 1 > ASSIGN !1, 1 2 > JMP ->4 7 3 > ASSIGN !1, 2 4 > > RETURN 1
並使用三元運算符
compiled vars: !0 = $var, !1 = $someThing line #* EIO op fetch ext return operands ------------------------------------------------------------------------------------- 3 0 E > > JMPZ !1, ->3 1 > QM_ASSIGN ~2 1 2 > JMP ->4 3 > QM_ASSIGN ~2 2 4 > ASSIGN !0, ~2 5 > RETURN 1
編輯
正如Barmar指出的那樣,並非所有方法都執行所有步驟,因為此處存在跳轉,並且並非所有步驟都具有相等的處理成本
是否完成$someThing
並不是機會,而是機器必須付出的努力。 讓我們來看看:
$var = 2;
if ($someThing) {
$var = 1;
}
表示分鍾 1個分配,1個檢查和最大 2個作業和1個檢查。
if ($someThing) {
$var = 1;
}
else {
$var = 2;
}
表示分鍾 1個分配,1個檢查和最大 1個作業和1個檢查。
else
是最優的。
注意:如果$someThing
在這段代碼之外依賴於$var
並且被重復調用,並且要絕對確保您的代碼是最佳的,則必須進行自動成本分析 ,這不是太瑣碎的事情。
您必須在組裝中想象它,這可能會因架構而異。
這是一些基本的偽代碼:
write $var 2
bne $something x
write $var 1
x:
要么
bne $something x
write $var 1
jmp y:
x:
write $var 2
y:
第一個有時會執行額外的寫操作。 第二個有時有一個額外的跳轉指令。 我認為跳轉指令會更快,並且分支預測將使它在后台進行進一步優化,因此我將選擇第二種選擇。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.