程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 關於字符串反轉的幾種方法的比較,字符串反轉幾種方法

關於字符串反轉的幾種方法的比較,字符串反轉幾種方法

編輯:C#入門知識

關於字符串反轉的幾種方法的比較,字符串反轉幾種方法


  下面先上代碼:

    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)元素的位置交換實現的字符串反轉。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved