面是实现字符串反转的四种方法:

几种字符串反转方法效率比较_反汇编            static string Reverse1(string original)

几种字符串反转方法效率比较_jar_02几种字符串反转方法效率比较_jar_03            ...{

几种字符串反转方法效率比较_赋值_04                char[] arr = original.ToCharArray();

几种字符串反转方法效率比较_赋值_04                Array.Reverse(arr);

几种字符串反转方法效率比较_赋值_04                return new string(arr);

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

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

几种字符串反转方法效率比较_反汇编            static string Revease21(string original)

几种字符串反转方法效率比较_jar_02几种字符串反转方法效率比较_jar_03            ...{

几种字符串反转方法效率比较_赋值_04                int length = original.Length;

几种字符串反转方法效率比较_赋值_04                char[] arr = new char[length];

几种字符串反转方法效率比较_赋值_04                for (int i = 0; i < (length & (~3)); i += 4)

几种字符串反转方法效率比较_i++_15几种字符串反转方法效率比较_反汇编_16                ...{

几种字符串反转方法效率比较_赋值_04                    arr[i] = original[length - i - 1];

几种字符串反转方法效率比较_赋值_04                    arr[i+1] = original[length - i - 2];

几种字符串反转方法效率比较_赋值_04                    arr[i+2] = original[length - i - 3];

几种字符串反转方法效率比较_赋值_04                    arr[i+3] = original[length - i - 4];

几种字符串反转方法效率比较_反汇编_21                }

几种字符串反转方法效率比较_赋值_04                for (int i = length & (~3); i < length; i++)

几种字符串反转方法效率比较_i++_15几种字符串反转方法效率比较_反汇编_16                ...{

几种字符串反转方法效率比较_赋值_04                    arr[i] = original[length - i - 1];

几种字符串反转方法效率比较_反汇编_21                }

几种字符串反转方法效率比较_赋值_04                return new string(arr);

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

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

几种字符串反转方法效率比较_反汇编            static string Revease22(string original)

几种字符串反转方法效率比较_jar_02几种字符串反转方法效率比较_jar_03            ...{

几种字符串反转方法效率比较_赋值_04                int length = original.Length;

几种字符串反转方法效率比较_赋值_04                char[] arr = new char[length];

几种字符串反转方法效率比较_赋值_04                for (int i = 0; i < length; i++)

几种字符串反转方法效率比较_i++_15几种字符串反转方法效率比较_反汇编_16                ...{

几种字符串反转方法效率比较_赋值_04                    arr[i] = original[length - i - 1];

几种字符串反转方法效率比较_反汇编_21                }

几种字符串反转方法效率比较_赋值_04                return new string(arr);

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

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

几种字符串反转方法效率比较_反汇编            static string Revease3(string original)

几种字符串反转方法效率比较_jar_02几种字符串反转方法效率比较_jar_03            ...{

几种字符串反转方法效率比较_赋值_04                int length = original.Length;

几种字符串反转方法效率比较_赋值_04                StringBuilder sb = new StringBuilder(length);

几种字符串反转方法效率比较_赋值_04                for (int i = length-1; i >= 0; i--)

几种字符串反转方法效率比较_赋值_04                sb.Append(original[i]);

几种字符串反转方法效率比较_赋值_04                return sb.ToString();

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

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

几种字符串反转方法效率比较_反汇编   static void Main(string[] args)

几种字符串反转方法效率比较_jar_02几种字符串反转方法效率比较_jar_03            ...{

几种字符串反转方法效率比较_赋值_04                string testString = "测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转";

几种字符串反转方法效率比较_赋值_04                DateTime start = DateTime.Now;

几种字符串反转方法效率比较_赋值_04                for (int i = 0; i < 3000000; i++)

几种字符串反转方法效率比较_i++_15几种字符串反转方法效率比较_反汇编_16                ...{

几种字符串反转方法效率比较_赋值_04                    string s = Reverse1(testString);

几种字符串反转方法效率比较_反汇编_21                }

几种字符串反转方法效率比较_赋值_04                DateTime end = DateTime.Now;

几种字符串反转方法效率比较_赋值_04                Console.WriteLine("1 :  "+(end - start));

几种字符串反转方法效率比较_赋值_04

几种字符串反转方法效率比较_赋值_04                start = DateTime.Now;

几种字符串反转方法效率比较_赋值_04                for (int i = 0; i < 3000000; i++)

几种字符串反转方法效率比较_i++_15几种字符串反转方法效率比较_反汇编_16                ...{

几种字符串反转方法效率比较_赋值_04                    string s = Revease21(testString);

几种字符串反转方法效率比较_反汇编_21                }

几种字符串反转方法效率比较_赋值_04                end = DateTime.Now;

几种字符串反转方法效率比较_赋值_04                Console.WriteLine("21:  " + (end - start));

几种字符串反转方法效率比较_赋值_04

几种字符串反转方法效率比较_赋值_04                start = DateTime.Now;

几种字符串反转方法效率比较_赋值_04                for (int i = 0; i < 3000000; i++)

几种字符串反转方法效率比较_i++_15几种字符串反转方法效率比较_反汇编_16                ...{

几种字符串反转方法效率比较_赋值_04                    string s = Revease22(testString);

几种字符串反转方法效率比较_反汇编_21                }

几种字符串反转方法效率比较_赋值_04                end = DateTime.Now;

几种字符串反转方法效率比较_赋值_04                Console.WriteLine("22:  " + (end - start));

几种字符串反转方法效率比较_赋值_04

几种字符串反转方法效率比较_赋值_04                start = DateTime.Now;

几种字符串反转方法效率比较_赋值_04                for (int i = 0; i < 3000000; i++)

几种字符串反转方法效率比较_i++_15几种字符串反转方法效率比较_反汇编_16                ...{

几种字符串反转方法效率比较_赋值_04                    string s = Revease3(testString);

几种字符串反转方法效率比较_反汇编_21                }

几种字符串反转方法效率比较_赋值_04                end = DateTime.Now;

几种字符串反转方法效率比较_赋值_04                Console.WriteLine("3 :  " + (end - start));

几种字符串反转方法效率比较_赋值_04

几种字符串反转方法效率比较_赋值_04                Console.ReadLine();

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

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

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

Debug:

1 :  00:00:03.4375000

21:  00:00:06.1250000

22:  00:00:09.9687500

3 :  00:01:05.5468750


Release:

1 :  00:00:05.7812500

21:  00:00:07.4218750

22:  00:00:08.2500000

3 :  00:00:50.3593750



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

几种字符串反转方法效率比较_反汇编[ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail)]

几种字符串反转方法效率比较_反汇编public static void Reverse(Array array)

几种字符串反转方法效率比较_jar_02几种字符串反转方法效率比较_jar_03...{

几种字符串反转方法效率比较_赋值_04      if (array == null)

几种字符串反转方法效率比较_i++_15几种字符串反转方法效率比较_反汇编_16      ...{

几种字符串反转方法效率比较_赋值_04            throw new ArgumentNullException("array");

几种字符串反转方法效率比较_反汇编_21      }

几种字符串反转方法效率比较_赋值_04      Array.Reverse(array, array.GetLowerBound(0), array.Length);

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

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

几种字符串反转方法效率比较_反汇编[ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail)]

几种字符串反转方法效率比较_反汇编public static void Reverse(Array array, int index, int length)

几种字符串反转方法效率比较_jar_02几种字符串反转方法效率比较_jar_03...{

几种字符串反转方法效率比较_赋值_04      int num1;

几种字符串反转方法效率比较_赋值_04      int num2;

几种字符串反转方法效率比较_赋值_04      if (array == null)

几种字符串反转方法效率比较_i++_15几种字符串反转方法效率比较_反汇编_16      ...{

几种字符串反转方法效率比较_赋值_04            throw new ArgumentNullException("array");

几种字符串反转方法效率比较_反汇编_21      }

几种字符串反转方法效率比较_赋值_04      if ((index < array.GetLowerBound(0)) || (length < 0))

几种字符串反转方法效率比较_i++_15几种字符串反转方法效率比较_反汇编_16      ...{

几种字符串反转方法效率比较_赋值_04            throw new ArgumentOutOfRangeException((index < 0) ? "index" : "length", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum"));

几种字符串反转方法效率比较_反汇编_21      }

几种字符串反转方法效率比较_赋值_04      if ((array.Length - (index - array.GetLowerBound(0))) < length)

几种字符串反转方法效率比较_i++_15几种字符串反转方法效率比较_反汇编_16      ...{

几种字符串反转方法效率比较_赋值_04            throw new ArgumentException(Environment.GetResourceString("Argument_InvalidOffLen"));

几种字符串反转方法效率比较_反汇编_21      }

几种字符串反转方法效率比较_赋值_04      if (array.Rank != 1)

几种字符串反转方法效率比较_i++_15几种字符串反转方法效率比较_反汇编_16      ...{

几种字符串反转方法效率比较_赋值_04            throw new RankException(Environment.GetResourceString("Rank_MultiDimNotSupported"));

几种字符串反转方法效率比较_反汇编_21      }

几种字符串反转方法效率比较_赋值_04      if (!Array.TrySZReverse(array, index, length))

几种字符串反转方法效率比较_i++_15几种字符串反转方法效率比较_反汇编_16      ...{

几种字符串反转方法效率比较_赋值_04            num1 = index;

几种字符串反转方法效率比较_赋值_04            num2 = (index + length) - 1;

几种字符串反转方法效率比较_赋值_04            object[] objArray1 = array as object[];

几种字符串反转方法效率比较_赋值_04            if (objArray1 == null)

几种字符串反转方法效率比较_i++_15几种字符串反转方法效率比较_反汇编_16            ...{

几种字符串反转方法效率比较_赋值_04                  goto Label_00DE;

几种字符串反转方法效率比较_反汇编_21            }

几种字符串反转方法效率比较_赋值_04            while (num1 < num2)

几种字符串反转方法效率比较_i++_15几种字符串反转方法效率比较_反汇编_16            ...{

几种字符串反转方法效率比较_赋值_04                  object obj1 = objArray1[num1];

几种字符串反转方法效率比较_赋值_04                  objArray1[num1] = objArray1[num2];

几种字符串反转方法效率比较_赋值_04                  objArray1[num2] = obj1;

几种字符串反转方法效率比较_赋值_04                  num1++;

几种字符串反转方法效率比较_赋值_04                  num2--;

几种字符串反转方法效率比较_反汇编_21            }

几种字符串反转方法效率比较_反汇编_21      }

几种字符串反转方法效率比较_赋值_04      return;

几种字符串反转方法效率比较_赋值_04Label_00DE:

几种字符串反转方法效率比较_赋值_04      if (num1 >= num2)

几种字符串反转方法效率比较_i++_15几种字符串反转方法效率比较_反汇编_16      ...{

几种字符串反转方法效率比较_赋值_04            return;

几种字符串反转方法效率比较_反汇编_21      }

几种字符串反转方法效率比较_赋值_04      object obj2 = array.GetValue(num1);

几种字符串反转方法效率比较_赋值_04      array.SetValue(array.GetValue(num2), num1);

几种字符串反转方法效率比较_赋值_04      array.SetValue(obj2, num2);

几种字符串反转方法效率比较_赋值_04      num1++;

几种字符串反转方法效率比较_赋值_04      num2--;

几种字符串反转方法效率比较_赋值_04      goto Label_00DE;

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



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

几种字符串反转方法效率比较_反汇编public StringBuilder Append(string value)

几种字符串反转方法效率比较_jar_02几种字符串反转方法效率比较_jar_03...{

几种字符串反转方法效率比较_赋值_04      if (value != null)

几种字符串反转方法效率比较_i++_15几种字符串反转方法效率比较_反汇编_16      ...{

几种字符串反转方法效率比较_赋值_04            string text1 = this.m_StringValue;

几种字符串反转方法效率比较_赋值_04            IntPtr ptr1 = Thread.InternalGetCurrentThread();

几种字符串反转方法效率比较_赋值_04            if (this.m_currentThread != ptr1)

几种字符串反转方法效率比较_i++_15几种字符串反转方法效率比较_反汇编_16            ...{

几种字符串反转方法效率比较_赋值_04                  text1 = string.GetStringForStringBuilder(text1, text1.Capacity);

几种字符串反转方法效率比较_反汇编_21            }

几种字符串反转方法效率比较_赋值_04            int num1 = text1.Length;

几种字符串反转方法效率比较_赋值_04            int num2 = num1 + value.Length;

几种字符串反转方法效率比较_赋值_04            if (this.NeedsAllocation(text1, num2))

几种字符串反转方法效率比较_i++_15几种字符串反转方法效率比较_反汇编_16            ...{

几种字符串反转方法效率比较_赋值_04                  string text2 = this.GetNewString(text1, num2);

几种字符串反转方法效率比较_赋值_04                  text2.AppendInPlace(value, num1);

几种字符串反转方法效率比较_赋值_04                  this.ReplaceString(ptr1, text2);

几种字符串反转方法效率比较_反汇编_21            }

几种字符串反转方法效率比较_赋值_04            else

几种字符串反转方法效率比较_i++_15几种字符串反转方法效率比较_反汇编_16            ...{

几种字符串反转方法效率比较_赋值_04                  text1.AppendInPlace(value, num1);

几种字符串反转方法效率比较_赋值_04                  this.ReplaceString(ptr1, text1);

几种字符串反转方法效率比较_反汇编_21            }

几种字符串反转方法效率比较_反汇编_21      }

几种字符串反转方法效率比较_赋值_04      return this;

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

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

几种字符串反转方法效率比较_反汇编private bool NeedsAllocation(string currentString, int requiredLength)

几种字符串反转方法效率比较_jar_02几种字符串反转方法效率比较_jar_03...{

几种字符串反转方法效率比较_赋值_04      return (currentString.ArrayLength <= requiredLength);

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

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

几种字符串反转方法效率比较_反汇编internal unsafe void AppendInPlace(string value, int currentLength)

几种字符串反转方法效率比较_jar_02几种字符串反转方法效率比较_jar_03...{

几种字符串反转方法效率比较_赋值_04      int num1 = value.Length;

几种字符串反转方法效率比较_赋值_04      int num2 = currentLength + num1;

几种字符串反转方法效率比较_赋值_04      fixed (char* chRef1 = &this.m_firstChar)

几种字符串反转方法效率比较_i++_15几种字符串反转方法效率比较_反汇编_16      ...{

几种字符串反转方法效率比较_赋值_04            fixed (char* chRef2 = &value.m_firstChar)

几种字符串反转方法效率比较_i++_15几种字符串反转方法效率比较_反汇编_16            ...{

几种字符串反转方法效率比较_赋值_04                  string.wstrcpy(chRef1 + currentLength, chRef2, num1);

几种字符串反转方法效率比较_反汇编_21            }

几种字符串反转方法效率比较_赋值_04            chRef1[num2] = '