你的位置:首页 > ASP.net教程

[ASP.net教程]关于字符串反转的几种方法的比较


  下面先上代码:

  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)元素的位置交换实现的字符串反转。