下面先上代碼:
class Program { static void Main(string[] args) { string str = "12345"; const int count = 10000; Stopwatch sw = Stopwatch.StartNew(); for (int i = 0; i < count; i++) { Reverse1(str); } Console.WriteLine("Reverse1耗時: {0}", sw.Elapsed); sw = Stopwatch.StartNew(); for (int i = 0; i < count; i++) { Reverse2(str); } Console.WriteLine("Reverse2耗時: {0}", sw.Elapsed); sw = Stopwatch.StartNew(); for (int i = 0; i < count; i++) { Reverse3(str); } Console.WriteLine("Reverse3耗時: {0}", sw.Elapsed); Console.ReadLine(); } /// <summary> /// 使用string拼接字符串 /// </summary> /// <param name="str"></param> /// <returns></returns> private static string Reverse1(string str) { string strReturn = ""; foreach (char c in str) { strReturn = c + strReturn; } return strReturn; } /// <summary> /// 使用StringBuilder拼接字符串 /// </summary> /// <param name="str"></param> /// <returns></returns> private static string Reverse2(string str) { if (String.IsNullOrEmpty(str)) { throw new ArgumentNullException("字符串為空!"); } StringBuilder sb = new StringBuilder(str.Length); for (int i = str.Length - 1; i >= 0; i--) { sb.Append(str[i]); } return sb.ToString(); } /// <summary> /// 使用FCL自帶的Array.Reverse() /// </summary> /// <param name="str"></param> /// <returns></returns> private static string Reverse3(string str) { var arr = str.ToCharArray(); Array.Reverse(arr); return new string(arr); } }
當前的循環次數為10000次,對比結果如圖:
顯然,三種反轉算法的性能比較為:Reverse1<Reverse2<Reverse3,我們把循環次數增大至1000000次,對比結果如圖:
從筆者的機器上的運行結果來看,性能比較結果依然為Reverse1<Reverse2<Reverse3。簡單說一下為什麼會有這樣的結果。Reverse1()和Reverse2()中主要是用字符串拼接實現的反轉,關於字符串的拼接,用StringBuilder要比用String要好的多,這主要跟string的不可變性有莫大關系。如果用Reflector.exe工具反匯編查看FCL自帶的Array.Reverse(),你會發現其代碼做了相當多的優化,而且並沒有使用字符串拼接來輔助實現字符串的反轉,它內部使用了數組(Array)元素的位置交換實現的字符串反轉。