`
feiliboos
  • 浏览: 662597 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多
面是实现字符串反转的四种方法:
staticstringReverse1(stringoriginal)
...{
char[]arr=original.ToCharArray();
Array.Reverse(arr);
returnnewstring(arr);
}


staticstringRevease21(stringoriginal)
...{
intlength=original.Length;
char[]arr=newchar[length];
for(inti=0;i<(length&(~3));i+=4)
...{
arr[i]
=original[length-i-1];
arr[i
+1]=original[length-i-2];
arr[i
+2]=original[length-i-3];
arr[i
+3]=original[length-i-4];
}

for(inti=length&(~3);i<length;i++)
...{
arr[i]
=original[length-i-1];
}

returnnewstring(arr);
}


staticstringRevease22(stringoriginal)
...{
intlength=original.Length;
char[]arr=newchar[length];
for(inti=0;i<length;i++)
...{
arr[i]
=original[length-i-1];
}

returnnewstring(arr);
}


staticstringRevease3(stringoriginal)
...{
intlength=original.Length;
StringBuildersb
=newStringBuilder(length);
for(inti=length-1;i>=0;i--)
sb.Append(original[i]);
returnsb.ToString();
}

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

   staticvoidMain(string[]args)
...{
stringtestString="测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转测试字符串反转";
DateTimestart
=DateTime.Now;
for(inti=0;i<3000000;i++)
...{
strings=Reverse1(testString);
}

DateTimeend
=DateTime.Now;
Console.WriteLine(
"1:"+(end-start));

start
=DateTime.Now;
for(inti=0;i<3000000;i++)
...{
strings=Revease21(testString);
}

end
=DateTime.Now;
Console.WriteLine(
"21:"+(end-start));

start
=DateTime.Now;
for(inti=0;i<3000000;i++)
...{
strings=Revease22(testString);
}

end
=DateTime.Now;
Console.WriteLine(
"22:"+(end-start));

start
=DateTime.Now;
for(inti=0;i<3000000;i++)
...{
strings=Revease3(testString);
}

end
=DateTime.Now;
Console.WriteLine(
"3:"+(end-start));

Console.ReadLine();
}

测试结果是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)]
publicstaticvoidReverse(Arrayarray)
...{
if(array==null)
...{
thrownewArgumentNullException("array");
}

Array.Reverse(array,array.GetLowerBound(
0),array.Length);
}


[ReliabilityContract(Consistency.MayCorruptInstance,Cer.MayFail)]
publicstaticvoidReverse(Arrayarray,intindex,intlength)
...{
intnum1;
intnum2;
if(array==null)
...{
thrownewArgumentNullException("array");
}

if((index<array.GetLowerBound(0))||(length<0))
...{
thrownewArgumentOutOfRangeException((index<0)?"index":"length",Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum"));
}

if((array.Length-(index-array.GetLowerBound(0)))<length)
...{
thrownewArgumentException(Environment.GetResourceString("Argument_InvalidOffLen"));
}

if(array.Rank!=1)
...{
thrownewRankException(Environment.GetResourceString("Rank_MultiDimNotSupported"));
}

if(!Array.TrySZReverse(array,index,length))
...{
num1
=index;
num2
=(index+length)-1;
object[]objArray1=arrayasobject[];
if(objArray1==null)
...{
gotoLabel_00DE;
}

while(num1<num2)
...{
objectobj1=objArray1[num1];
objArray1[num1]
=objArray1[num2];
objArray1[num2]
=obj1;
num1
++;
num2
--;
}

}

return;
Label_00DE:
if(num1>=num2)
...{
return;
}

objectobj2=array.GetValue(num1);
array.SetValue(array.GetValue(num2),num1);
array.SetValue(obj2,num2);
num1
++;
num2
--;
gotoLabel_00DE;
}

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

publicStringBuilderAppend(stringvalue)
...{
if(value!=null)
...{
stringtext1=this.m_StringValue;
IntPtrptr1
=Thread.InternalGetCurrentThread();
if(this.m_currentThread!=ptr1)
...{
text1
=string.GetStringForStringBuilder(text1,text1.Capacity);
}

intnum1=text1.Length;
intnum2=num1+value.Length;
if(this.NeedsAllocation(text1,num2))
...{
stringtext2=this.GetNewString(text1,num2);
text2.AppendInPlace(value,num1);
this.ReplaceString(ptr1,text2);
}

else
...{
text1.AppendInPlace(value,num1);
this.ReplaceString(ptr1,text1);
}

}

returnthis;
}


privateboolNeedsAllocation(stringcurrentString,intrequiredLength)
...{
return(currentString.ArrayLength<=requiredLength);
}


internalunsafevoidAppendInPlace(stringvalue,intcurrentLength)
...{
intnum1=value.Length;
intnum2=currentLength+num1;
fixed(char*chRef1=&this.m_firstChar)
...{
fixed(char*chRef2=&value.m_firstChar)
...{
string.wstrcpy(chRef1+currentLength,chRef2,num1);
}

chRef1[num2]
='
分享到:
评论

相关推荐

    JAVA面试题最全集

    写一个方法,实现字符串的反转,如:输入abc,输出cba 写一个方法,实现字符串的替换,如:输入bbbwlirbbb,输出bbbhhtccc。 3.数据类型之间的转换 如何将数值型字符转换为数字(Integer,Double) 如何将数字...

    Java经典编程源码基础例程300.zip

    实例070 实例化Class类的几种方式 107 实例071 查看类的声明 108 实例072 查看类的成员 110 实例073 查看内部类信息 112 实例074 动态设置类的私有域 113 实例075 动态调用类中方法 115 实例076 动态实例化类 116 ...

    java面试题

    多线程几种实现方法,同步? 答:多线程有两种实现方法,一种是继承Thread类或者实现Runnable接口。同步就是在方法返回类型后面加上synchronized。 c#中的委托,事件是不是委托? 答:委托就是将方法作为一个参数...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例049 用数组反转字符串 60 3.3 数组排序与查询 61 实例050 使用选择排序法 61 实例051 使用冒泡排序法 62 实例052 使用快速排序法 64 实例053 使用直接插入法 65 实例054 使用sort方法对数组进行排序 67 实例055 ...

    EXCEL集成工具箱V6.0

    细分为&lt;用数字顺序或倒序&gt;&lt;用EXCEL存储格内容&gt;&lt;增加字符串&gt;&lt;清除字符串&gt;&lt;替换字符串&gt;多方式改名,优点明显。例:替换字符串就支持起始长度、替换个数、GB2与BIG5码相互转换等多选项操作,也支持文件扩展名的修改。现...

    EXCEL集成工具箱V8.0完整增强版(精简)

    细分为&lt;用数字顺序或倒序&gt;&lt;用EXCEL存储格内容&gt;&lt;增加字符串&gt;&lt;清除字符串&gt;&lt;替换字符串&gt;多方式改名,优点明显。例:替换字符串就支持起始长度、替换个数、GB2与BIG5码相互转换等多选项操作,也支持文件扩展名的修改。现...

    asp.net知识库

    .NET 2.0中的字符串比较 小试ASP.NET 2.0的兼容性 为 asp.net 2.0 的菜单控件增加 target 属性 ASP.NET 2.0 的内部变化 常见的 ASP.NET 2.0 转换问题和解决方案 Asp.Net2.0无刷新客户端回调 体验.net 2.0 的优雅(1...

    SuperNotepad

    strreverse("") 字符串反转 replace("","","") 字串内替换 instr("","") 字串内出现指定字符的首位置 instrrev("","") 字串内出现指定字符的末位置 inputbox("") 输入窗口 msgbox(""[,num,""]) 消息窗口 ...

    语言程序设计课后习题答案

    1-11 简要比较原码、反码、补码等几种编码方法。 解: 原码:将符号位数字化为 0 或 1,数的绝对值与符号一起编码,即所谓"符号──绝对值表示"的编码。 正数的反码和补码与原码表示相同。 负数的反码与原码有如下...

    精易模块[源码] V5.15

    6、优化“时间_取中国星期几”命令,感谢易友【灵魂出窍808】提议。 7、新增“网页_取网络文件尺寸”获取网络文件尺寸,失败返回零。 8、新增“数组_取次数”,取指定数组成员出现相同数量,源码由易友【C盘是头猪】...

Global site tag (gtag.js) - Google Analytics