关于字符串反转的几种方法的比较_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > 关于字符串反转的几种方法的比较

关于字符串反转的几种方法的比较

 2015/4/2 22:50:35  Mr.Jack  程序员俱乐部  我要评论(0)
  • 摘要:下面先上代码:classProgram{staticvoidMain(string[]args){stringstr="12345";constintcount=10000;Stopwatchsw=Stopwatch.StartNew();for(inti=0;i<count;i++){Reverse1(str);}Console.WriteLine("Reverse1耗时:{0}",sw.Elapsed);sw=Stopwatch.StartNew();for(inti=0;i<
  • 标签:方法 字符串

  下面先上代码:

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

 

发表评论
用户名: 匿名