重構背景及原因
最近由於項目組的人員在不斷擴充,導致項目中代碼風格各異,大有百花齊放甚至怒放之勢。考慮到團隊的生存與發展,經過眾人多次舌戰之后,最終決定項目組根據業務分成幾個小分隊,以加強團隊管理與提高效率,同時也能培養階梯人才。各個小分隊為了“統一”代碼風格,提高成員的代碼能力以便最終能提高項目代碼質量,減少以后的維護成本,最終決定“每日”進行小組內的代碼走查/審查(Code Review),然后進行代碼重構。
直接比較與非比較:我所謂的直接比較與非比較是指"=="判斷方式與"!="判斷方式,如以下代碼
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 }
看到這里時有的朋友會說這有什么好說的呀,這又沒什么影響,效果不一樣么?那么我們看下以上代碼執行結果吧,執行結果如下圖:

看到這張圖時,可能有些朋友就笑了說,這差別也“忒大了”吧,10000000次才相差2.6毫秒呀,這有意思么?還好意思在這兒寫。只是我覺得既然有性能上的差異的話,我們為什么不用好的哪一個呢?
在此感謝園友“小彬”指出string.Equals的性能更好,然后經過我的測試,測試結果如下:

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