我們先來看一段非常簡單的代碼
for i in range(10000):
x[i] = x[i] + 10
看到這代碼仔拟,肯定有小伙伴會有疑問衫樊,這么簡單的代碼你告訴我竟然可以優(yōu)化?利花?橡伞?
file
不急不急盒揉,且聽我慢慢分析:
首先我們要意識到,這個(gè)循環(huán)體循環(huán)了10000次兑徘。
那么加速的其中一個(gè)關(guān)鍵就是減少循環(huán)次數(shù)刚盈,因?yàn)槊看窝h(huán)結(jié)束之后本質(zhì)上都是一個(gè)分支指令的判斷,判斷這次循環(huán)是否結(jié)束挂脑。如果是則跳出循環(huán)藕漱,進(jìn)行下一個(gè)代碼塊的執(zhí)行,否則繼續(xù)循環(huán)崭闲。
我們可以充分利用cpu內(nèi)的寄存器肋联。
程序在執(zhí)行前,編譯器會自動(dòng)給我們的加法指令分配各個(gè)不同的寄存器刁俭,避免指令流水線的數(shù)據(jù)沖突橄仍,這樣循環(huán)內(nèi)多路并行也降低了時(shí)間開銷。
得此牍戚,優(yōu)化后我們的程序如下:
for i in range(0, 10000, 5):
x[i] = x[i] + 10
x[i+1] = x[i+1] + 10
x[i+2] = x[i+2] + 10
x[i+3] = x[i+3] + 10
x[i+4] = x[i+4] + 10
經(jīng)過測試侮繁,優(yōu)化后的程序所花時(shí)間為69ms,而未經(jīng)優(yōu)化的程序時(shí)間為81ms如孝。
飽受leetcode超時(shí)困擾的小伙伴宪哩,這樣的小trick也許能幫助你們僥幸過關(guān)!
file
如果對這些優(yōu)化感興趣的小伙伴第晰,可以參考計(jì)算機(jī)體系結(jié)構(gòu)相關(guān)內(nèi)容學(xué)習(xí)锁孟。