几种字符串反转方法效率比较

Posted by

  return new string(nm);

图片 1   static void Main(string[] args)
图片 2图片 3            …{
图片 4                string testString = “测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转”;
图片 5                DateTime start = DateTime.Now;
图片 6                for (int i = 0; i < 3000000; i++)
图片 7图片 8                …{
图片 9                    string s = Reverse1(testString);
图片 10                }
图片 11                DateTime end = DateTime.Now;
图片 12                Console.WriteLine(“1 :  “+(end – start));
图片 13
图片 14                start = DateTime.Now;
图片 15                for (int i = 0; i < 3000000; i++)
图片 16图片 17                …{
图片 18                    string s = Revease21(testString);
图片 19                }
图片 20                end = DateTime.Now;
图片 21                Console.WriteLine(“21:  ” + (end – start));
图片 22
图片 23                start = DateTime.Now;
图片 24                for (int i = 0; i < 3000000; i++)
图片 25图片 26                …{
图片 27                    string s = Revease22(testString);
图片 28                }
图片 29                end = DateTime.Now;
图片 30                Console.WriteLine(“22:  ” + (end – start));
图片 31
图片 32                start = DateTime.Now;
图片 33                for (int i = 0; i < 3000000; i++)
图片 34图片 35                …{
图片 36                    string s = Revease3(testString);
图片 37                }
图片 38                end = DateTime.Now;
图片 39                Console.WriteLine(“3 :  ” + (end – start));
图片 40
图片 41                Console.ReadLine();
图片 42            }

     return new string(reverse);
}

 Revease1()中对char[]进行了两次赋值(ToCharArray()和Array.Revease),所以我有想到了Revease2和Revease3()两种方法,下面是对这四种方法进行简单性能测试的代码:

方法一:

图片 43            static string Reverse1(string original)
图片 44图片 45            …{
图片 46                char[] arr = original.ToCharArray();
图片 47                Array.Reverse(arr);
图片 48                return new string(arr);
图片 49            }
图片 50
图片 51            static string Revease21(string original)
图片 52图片 53            …{
图片 54                int length = original.Length;
图片 55                char[] arr = new char[length];
图片 56                for (int i = 0; i < (length & (~3)); i += 4)
图片 57图片 58                …{
图片 59                    arr[i] = original[length – i – 1];
图片 60                    arr[i+1] = original[length – i – 2];
图片 61                    arr[i+2] = original[length – i – 3];
图片 62                    arr[i+3] = original[length – i – 4];
图片 63                }
图片 64                for (int i = length & (~3); i < length; i++)
图片 65图片 66                …{
图片 67                    arr[i] = original[length – i – 1];
图片 68                }
图片 69                return new string(arr);
图片 70            }
图片 71
图片 72            static string Revease22(string original)
图片 73图片 74            …{
图片 75                int length = original.Length;
图片 76                char[] arr = new char[length];
图片 77                for (int i = 0; i < length; i++)
图片 78图片 79                …{
图片 80                    arr[i] = original[length – i – 1];
图片 81                }
图片 82                return new string(arr);
图片 83            }
图片 84
图片 85            static string Revease3(string original)
图片 86图片 87            …{
图片 88                int length = original.Length;
图片 89                StringBuilder sb = new StringBuilder(length);
图片 90                for (int i = length-1; i >= 0; i–)
图片 91                sb.Append(original[i]);
图片 92                return sb.ToString();
图片 93            }

 

但还有个奇怪的问题,就是Debug版本中的Revease1()和Revease21()运行起来要比Release版本中的要快,而Revease22()和Revease3()就比较正常。按说Release时做了更多的优化工作,运行起来更快才对,迷惑ing…,下面是测试结果:

 

Release:

 

测试结果是Revease1()代码最简洁,运行速度也最快,Revease21()和Revease22()其次,Revease3()最慢。可见.net
framework中实现的ToCharArray()和Array.Revease()效率还是蛮高的^_^

public static string Reverse(string name)
{
     char[] reverse = name.Reverse().ToArray();

附2:StringBuilder.Append()方法的源码(由Reflector.exe反汇编得到):

 

附1:Array.Revease()方法的源码(由Reflector.exe反汇编得到):

相关文章

Leave a Reply

电子邮件地址不会被公开。 必填项已用*标注