項(xiàng)目中經(jīng)常會(huì)遇到有一個(gè)思維上的困擾:是先 if 再賦值法瑟,還是直接賦值呢?
直接賦值在代碼上會(huì)更加優(yōu)美酷麦,減少了一層判斷。但是同時(shí)也會(huì)好奇喉恋,到底哪種做法在效率上更優(yōu)沃饶,這個(gè)實(shí)現(xiàn)也簡(jiǎn)單,就動(dòng)手試了試轻黑。
拍腦袋的錯(cuò)誤結(jié)論:判斷效率優(yōu)于賦值
論證:
滿(mǎn)以為是得出結(jié)論還是比較快一點(diǎn)糊肤,但是一想,不對(duì)啊氓鄙,這個(gè)是數(shù)組的馆揉,相對(duì)來(lái)說(shuō),不是最簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu)抖拦,換其他的試試呢升酣。
然后換了其他數(shù)據(jù)類(lèi)型試試:(下列數(shù)據(jù)都是多次實(shí)驗(yàn)取的中位數(shù))
int,直接賦值:169ms 态罪, 判斷賦值:233ms噩茄。
string,直接賦值:171ms 向臀, 判斷賦值:228ms。
bool诸狭,直接賦值:206ms 券膀, 判斷賦值:232ms君纫。
float,直接賦值:175ms 芹彬, 判斷賦值:237ms蓄髓。
降數(shù)據(jù)量級(jí)到1000000,測(cè)試復(fù)雜數(shù)據(jù)類(lèi)型
Dictionary舒帮,直接賦值:94ms 会喝, 判斷賦值:20ms。
HashTable玩郊,直接賦值:115ms 肢执, 判斷賦值:20ms。
真正結(jié)論:在簡(jiǎn)單數(shù)據(jù)類(lèi)型下直接賦值更快译红。
其實(shí)也不難理解预茄,因?yàn)閺?fù)雜數(shù)據(jù)類(lèi)型具體內(nèi)部的操作多所以耗時(shí)久,真正在使用中的話(huà)侦厚,這種量級(jí)的差異完全是可以忽略不計(jì)的耻陕,簡(jiǎn)單、可讀才應(yīng)該是需要重視的刨沦。
Readability counts
附:深入思考了下诗宣,其實(shí)以上結(jié)論都是不全面而有問(wèn)題的。我們最終需要比較的其實(shí)是最終執(zhí)行的底層操作效率:if 括號(hào)內(nèi)的操作 和 if內(nèi)的操作想诅。用簡(jiǎn)單的例子來(lái)說(shuō)明召庞,if (i < 100) { num = 100; },這就是比較 < 100 和 = 100的執(zhí)行效率侧蘸,從C#往下一層到中間語(yǔ)言IL(intermidiate language)裁眯,這個(gè)操作就變成了 cmp 和 mov(用學(xué)過(guò)的匯編做比喻),在往下就成了01的比較了讳癌。在01的比較中穿稳,因?yàn)閏mp減法比較是涉及到借位減等復(fù)雜操作的,所以自然在效率上是低于直接mov賦值的晌坤,就造成了直接賦值比比較快的現(xiàn)象逢艘。(個(gè)人推斷,沒(méi)有查證)