讓代碼重構(gòu)漸行漸遠(yuǎn)系列(3)——string.Equals取代直接比較與非比較
重構(gòu)背景及原因
最近由于項目組的人員在不斷擴(kuò)充,導(dǎo)致項目中代碼風(fēng)格各異,大有百花齊放甚至怒放之勢。考慮到團(tuán)隊的生存與發(fā)展,經(jīng)過眾人多次舌戰(zhàn)之后,最終決定項目組根據(jù)業(yè)務(wù)分成幾個小分隊,以加強(qiáng)團(tuán)隊管理與提高效率,同時也能培養(yǎng)階梯人才。各個小分隊為了“統(tǒng)一”代碼風(fēng)格,提高成員的代碼能力以便最終能提高項目代碼質(zhì)量,減少以后的維護(hù)成本,最終決定“每日”進(jìn)行小組內(nèi)的代碼走查/審查(Code Review),然后進(jìn)行代碼重構(gòu)。
直接比較與非比較:我所謂的直接比較與非比較是指"=="判斷方式與"!="判斷方式,如以下代碼
1 public static void 直接判斷() 2 { 3 Stopwatch timer = new Stopwatch(); 4 timer.Start(); 5 6 string str = "測試字符串"; 7 for (int i = 0; i < 10; i++) 8 { 9 Stopwatch timer2 = new Stopwatch(); 10 timer2.Start(); 11 for (int j = 0; j < 10000000; j++) 12 { 13 if ("測試字符串" == str) 14 { 15 } 16 } 17 timer2.Stop(); 18 Console.WriteLine("直接判斷第" + i + "次耗時:" + (timer2.ElapsedMilliseconds)); 19 20 } 21 timer.Stop(); 22 Console.WriteLine("直接判斷平均耗時:" + (timer.ElapsedMilliseconds * 1.0 / 10)); 23 24 } 25 26 public static void 非判斷() 27 { 28 Stopwatch timer = new Stopwatch(); 29 timer.Start(); 30 31 string str = "測試字符串"; 32 for (int i = 0; i < 10; i++) 33 { 34 Stopwatch timer2 = new Stopwatch(); 35 timer2.Start(); 36 for (int j = 0; j < 10000000; j++) 37 { 38 if ("測試字符串" != str) 39 { 40 41 42 } 43 } 44 timer2.Stop(); 45 Console.WriteLine("非判斷第" + i + "次耗時:" + (timer2.ElapsedMilliseconds)); 46 47 } 48 timer.Stop(); 49 Console.WriteLine("非判斷平均耗時:" + (timer.ElapsedMilliseconds * 1.0 / 10)); 50 51 }
看到這里時有的朋友會說這有什么好說的呀,這又沒什么影響,效果不一樣么?那么我們看下以上代碼執(zhí)行結(jié)果吧,執(zhí)行結(jié)果如下圖:

看到這張圖時,可能有些朋友就笑了說,這差別也“忒大了”吧,10000000次才相差2.6毫秒呀,這有意思么?還好意思在這兒寫。只是我覺得既然有性能上的差異的話,我們?yōu)槭裁床挥煤玫哪囊粋€呢?
在此感謝園友“小彬”指出string.Equals的性能更好,然后經(jīng)過我的測試,測試結(jié)果如下:

耗時情況: string.Equals< == < !=
總結(jié):在做字符串比較判斷是優(yōu)先考慮 string.Equals 。
還是那句話,如果我們在寫代碼的時候就考慮到了這些我們還需要再花時間做此種重構(gòu)么?代碼重構(gòu)怎能不漸行漸遠(yuǎn)呢?
以下是系列文章鏈接:
讓代碼重構(gòu)漸行漸遠(yuǎn)系列(1)——解除多層嵌套
讓代碼重構(gòu)漸行漸遠(yuǎn)系列(2)——降低代碼重復(fù)度
讓代碼重構(gòu)漸行漸遠(yuǎn)系列(3)——string.Equals取代直接比較與非比較

浙公網(wǎng)安備 33010602011771號