有何不可

人生好比江上月,喜也圆缺,悲也圆缺,俱随舟前缕缕风。

导航

字符串填充的三种方法及性能比较

Posted on 2004-12-24 11:44  有何不可  阅读(3600)  评论(5编辑  收藏  举报

目前找到了三种方法来填充字符串
1:构造替换
  就是先利用String的构造函数来得到由某个字符X组成并重复N次的字符串,然后用String成员函数Replace()来将这个X替换成目标字符串
2:累加法
  写个了函数来得到重复串,在函数中,建了一个循环,在里面用StringBuilder的Append()进行累加,最后返回结果串
3:Pad替换法
  用String的成员函数PadLeft()在字符串的左边添加重复了N次的某个字符X,然后对字符串进行替换,把X替换成目标字符串
三种方法中,第一和第三种看上去比较简洁,但不知道效率如何。下面对三种方法进行测试,10000次外循环,重复1000次要添加的串,代码如下:

using System;
using System.Collections;

public class MyClass
{
 
public static void Main()
 
{
  
string str = "SADTHDGSAFSDGTGHRDGSADFADDRHDFSGASDAA"
  
string repStr = "abc134321432";
  
long t;
  DateTime dtBegin 
= DateTime.Now; 
  
  
for(int i=0; i < 10000; i ++)
  
{
   
//string result = (new String('$', 1000)).Replace("$", repStr) + str;//构造替换法:968
   
//string result = GeneralString(1000, repStr) + str;//累加法:1718
   
//string result = str.PadLeft(1000, '$').Replace("$", repStr);//Pad替换法:609
  }

   t 
= (long)(DateTime.Now - dtBegin).TotalMilliseconds; 
  WL(t.ToString());
  RL();
 }

 
 
private static string GeneralString(int n, string par)
 
{
     System.Text.StringBuilder a 
= new System.Text.StringBuilder();
  
for (int i=0;i<n;i++)
  
{
      a.Append(par);
  }

  
return a.ToString();
 }


 
 
private static void WL(string text, params object[] args)
 
{
  Console.WriteLine(text, args); 
 }

 
 
private static void RL()
 
{
  Console.ReadLine(); 
 }

 
 
private static void Break() 
 
{
  System.Diagnostics.Debugger.Break();
 }

}


每种方法后面是我机器上的测试结果:
1、构造替换法:968
2、累加替换法:1718
3、Pad替换法:609

因此可见Pad替换法效率是最高的,面用了StringBuilder的累加替换法效率是最差的,所用时间几乎是3、Pad替换法的三倍。这也应证了从字符串中查找字符出现次数的方法和性能再比里面得出的结论。
不过要注意的一点是,Pad替换法所用的代换字符X必须是在原始字符串的不会出现的字符。而其它两种方法就没有这个限制。