C#寫的代碼,有個地方稍不留神,就產生了對性能的嚴重影響 ,那就是隱式轉換。看一下代碼:
這代碼一眼看上去,什麼問題都沒有,更可惡的是,連編譯警告都沒有,我絕對認為這是不應該的。因為int跟uint的取值范圍不同,為了確保比較出來的結果正確,編譯器自動把a轉換成long,把b轉換成ulong,進行比較,比較的答案很正確,卻嚴重影響了性能。
如果在代碼中,能確定a、b都不會超出int的的最大值,絕對可以uint轉換成int來進行比較,性能能大大提高。看一下兩段測試代碼:
沒有手動進行轉換:
OR: #000000"> (a > b) b++;
if (a <= b) a++;
if (a > b) b++;
if (a <= b) a++;
if (a > b) b++;
if (a <= b) a++;
if (a > b) b++;
}
Console.WriteLine(Environment.TickCount - start);
我電腦的測試時間大概是3.3秒
我電腦的測試時間大概是1.3秒
這點不起眼的改動,程序快了2.5倍。(循環體中之所以加上多句判斷,是因為想減少循環計數對測試時間的影響。)
技術討論的QQ群: 2514097 或 10987609