讓我們手動將其編譯成x86彙編第一更好地瞭解(任何其他會做):
mov ebx, 0 // this is our var i
.L0:
# /------------ inner loop start -----------\
mov eax, 0 // this is our var j
.L1:
// ...
add eax, 1
cmp eax, 50
jl .L1 // jump one
# \------------ inner loop end -------------/
add ebx, 1
cmp ebx, 100
jl .L0 // jump two
我覺得這個代碼是非常簡單的,即使你不熟悉彙編:
- 套裝EBX到
0
- 跳2回來這裏
- 套裝EAX到
0
- 跳一個回來這裏
- 執行我們的循環代碼
// ...
- 添加
1
到EAX
- 比較EAX到
50
(這會在標誌中設置一些位註冊)
- 跳轉到label
.L1:
如果EAX不是50
- 添加
1
到EBX
- 比較EBX到
50
(這個參數設置一些比特的標誌寄存器)
- 跳如果ebx不是100,則標記
.L0:
- 結束lo OPS
所以在第一次循環,我們到達跳一個並預測它會採取。由於eax < 50
我們把它和更新到強烈採取。現在我們再做48次。在50次迭代中,我們不跳,因爲eax == 50
。這是一個單錯預測,我們更新爲弱取。
現在我們到達跳2首次。因爲ebx < 100
我們把它和更新它強採用。現在我們通過跳到L0
開始所有內部循環。我們再做98次。在內循環的100次迭代中,我們不跳,因爲ebx == 100
。這是一個單錯預測,我們更新爲弱取。
所以我們執行innerloop 100次有單錯誤預測每共計100預測失誤爲跳一個和100 * 49 = 4900
正確的預測。外循環只執行一次,只有1錯誤預測和99
正確的預測。
試圖清楚表明它是關於分支預測的。其他我的閱讀,不明白,這是一個明確的主題... – xMRi