String PK StringBuilder,传说就是传说,只有动手实验,才能得出确定的答案

本机测试结果如下:

大部分情况下,string 性能并不比StringBuilder差,只有特殊情况才出现差异,并非 如前面有些朋友测试的结果哪样,只要使用StringBuilder 就一定比String表现优异。

另外,大多数测试者都没有考虑内存分配的时间与成本(因为大多数的内存都比较在>2G)。

本次测试也只考虑 时间运行 效率,没有考虑空间成本

本次测试条件:.net 4.0  硬件:Tinkpad t540P,4G内存 win8.1

 

第一种方法:

 

  1 [TestClass]
  2      public  class StringTest1
  3     {
  4         [TestMethod]
  5          public  void String1Test1()
  6         {
  7              for ( int i =  0; i <  1; i++)
  8             {
  9                  string queryString =  @" select p from DALParty as p where p.OwnerID=:OwnerID ";
 10                 queryString +=  "  and (p.Name like :Name  or p.Code like :Name or p.TaxCode like :Name) ";
 11                 queryString +=  "  order by p.Name  ";
 12             }
 13         }
 14         [TestMethod]
 15          public  void String10Test1()
 16         {
 17              for ( int i =  0; i <  10; i++)
 18             {
 19                  string queryString =  @" select p from DALParty as p where p.OwnerID=:OwnerID ";
 20                 queryString +=  "  and (p.Name like :Name  or p.Code like :Name or p.TaxCode like :Name) ";
 21                 queryString +=  "  order by p.Name  ";
 22             }
 23         }
 24         [TestMethod]
 25          public  void String100Test1()
 26         {
 27              for ( int i =  0; i <  100; i++)
 28             {
 29                  string queryString =  @" select p from DALParty as p where p.OwnerID=:OwnerID ";
 30                 queryString +=  "  and (p.Name like :Name  or p.Code like :Name or p.TaxCode like :Name) ";
 31                 queryString +=  "  order by p.Name  ";
 32             }
 33         }
 34         [TestMethod]
 35          public  void String1000Test1()
 36         {
 37              for ( int i =  0; i <  1000; i++)
 38             {
 39                  string queryString =  @" select p from DALParty as p where p.OwnerID=:OwnerID ";
 40                 queryString +=  "  and (p.Name like :Name  or p.Code like :Name or p.TaxCode like :Name) ";
 41                 queryString +=  "  order by p.Name  ";
 42             }
 43         }
 44         [TestMethod]
 45          public  void String10000Test1()
 46         {
 47              for ( int i =  0; i <  10000; i++)
 48             {
 49                  string queryString =  @" select p from DALParty as p where p.OwnerID=:OwnerID ";
 50                 queryString +=  "  and (p.Name like :Name  or p.Code like :Name or p.TaxCode like :Name) ";
 51                 queryString +=  "  order by p.Name  ";
 52             }
 53         }
 54 
 55         [TestMethod]
 56          public  void StringBuilder1Test1()
 57         {            
 58              for ( int i =  0; i <  1; i++)
 59             {
 60                 StringBuilder ssb =  new StringBuilder();
 61                 ssb.Append( @" select p from DALParty as p where p.OwnerID=:OwnerID ");
 62                 ssb.Append( "  and (p.Name like :Name  or p.Code like :Name or p.TaxCode like :Name) ");
 63                 ssb.Append( "  order by p.Name  ");
 64             }
 65         }
 66         [TestMethod]
 67          public  void StringBuilder10Test1()
 68         {
 69              for ( int i =  0; i <  10; i++)
 70             {
 71                 StringBuilder ssb =  new StringBuilder();
 72                 ssb.Append( @" select p from DALParty as p where p.OwnerID=:OwnerID ");
 73                 ssb.Append( "  and (p.Name like :Name  or p.Code like :Name or p.TaxCode like :Name) ");
 74                 ssb.Append( "  order by p.Name  ");
 75             }
 76         }
 77         [TestMethod]
 78          public  void StringBuilder100Test1()
 79         {
 80              for ( int i =  0; i <  100; i++)
 81             {
 82                 StringBuilder ssb =  new StringBuilder();
 83                 ssb.Append( @" select p from DALParty as p where p.OwnerID=:OwnerID ");
 84                 ssb.Append( "  and (p.Name like :Name  or p.Code like :Name or p.TaxCode like :Name) ");
 85                 ssb.Append( "  order by p.Name  ");
 86             }
 87         }
 88         [TestMethod]
 89          public  void StringBuilder1000Test1()
 90         {
 91              for ( int i =  0; i <  1000; i++)
 92             {
 93                 StringBuilder ssb =  new StringBuilder();
 94                 ssb.Append( @" select p from DALParty as p where p.OwnerID=:OwnerID ");
 95                 ssb.Append( "  and (p.Name like :Name  or p.Code like :Name or p.TaxCode like :Name) ");
 96                 ssb.Append( "  order by p.Name  ");
 97             }
 98         }
 99         [TestMethod]
100          public  void StringBuilder10000Test1()
101         {
102              for ( int i =  0; i <  10000; i++)
103             {
104                 StringBuilder ssb =  new StringBuilder();
105                 ssb.Append( @" select p from DALParty as p where p.OwnerID=:OwnerID ");
106                 ssb.Append( "  and (p.Name like :Name  or p.Code like :Name or p.TaxCode like :Name) ");
107                 ssb.Append( "  order by p.Name  ");
108             }
109         }
110     }
View Code

第二种方法

 

  1 [TestClass]
  2      public  class StringTest2
  3     {
  4         [TestMethod]
  5          public  void String1Test2()
  6         {
  7              string queryString =  string.Empty;
  8              for ( int i =  0; i <  1; i++)
  9             {
 10                 queryString =  string.Empty;
 11                 queryString =  @" select p from DALParty as p where p.OwnerID=:OwnerID ";
 12                 queryString +=  "  and (p.Name like :Name  or p.Code like :Name or p.TaxCode like :Name) ";
 13                 queryString +=  "  order by p.Name  ";
 14             }
 15         }
 16         [TestMethod]
 17          public  void String10Test2()
 18         {
 19              string queryString =  string.Empty;
 20              for ( int i =  0; i <  10; i++)
 21             {
 22                 queryString =  string.Empty;
 23                 queryString =  @" select p from DALParty as p where p.OwnerID=:OwnerID ";
 24                 queryString +=  "  and (p.Name like :Name  or p.Code like :Name or p.TaxCode like :Name) ";
 25                 queryString +=  "  order by p.Name  ";
 26             }
 27         }
 28         [TestMethod]
 29          public  void String100Test2()
 30         {
 31              string queryString =  string.Empty;
 32              for ( int i =  0; i <  100; i++)
 33             {
 34                 queryString =  string.Empty;
 35                 queryString =  @" select p from DALParty as p where p.OwnerID=:OwnerID ";
 36                 queryString +=  "  and (p.Name like :Name  or p.Code like :Name or p.TaxCode like :Name) ";
 37                 queryString +=  "  order by p.Name  ";
 38             }
 39         }
 40         [TestMethod]
 41          public  void String1000Test2()
 42         {
 43              string queryString =  string.Empty;
 44              for ( int i =  0; i <  1000; i++)
 45             {
 46                 queryString =  string.Empty;
 47                 queryString =  @" select p from DALParty as p where p.OwnerID=:OwnerID ";
 48                 queryString +=  "  and (p.Name like :Name  or p.Code like :Name or p.TaxCode like :Name) ";
 49                 queryString +=  "  order by p.Name  ";
 50             }
 51         }
 52         [TestMethod]
 53          public  void String10000Test2()
 54         {
 55              string queryString =  string.Empty;
 56              for ( int i =  0; i <  10000; i++)
 57             {
 58                 queryString =  string.Empty;
 59                 queryString =  @" select p from DALParty as p where p.OwnerID=:OwnerID ";
 60                 queryString +=  "  and (p.Name like :Name  or p.Code like :Name or p.TaxCode like :Name) ";
 61                 queryString +=  "  order by p.Name  ";
 62             }
 63         }
 64 
 65         [TestMethod]
 66          public  void StringBuilder1Test2()
 67         {
 68             StringBuilder ssb =  new StringBuilder();
 69              for ( int i =  0; i <  1; i++)
 70             {
 71                 ssb.Clear();
 72                 ssb.Append( @" select p from DALParty as p where p.OwnerID=:OwnerID ");
 73                 ssb.Append( "  and (p.Name like :Name  or p.Code like :Name or p.TaxCode like :Name) ");
 74                 ssb.Append( "  order by p.Name  ");
 75             }
 76         }
 77         [TestMethod]
 78          public  void StringBuilder10Test2()
 79         {
 80             StringBuilder ssb =  new StringBuilder();
 81              for ( int i =  0; i <  10; i++)
 82             {
 83                 ssb.Clear();
 84                 ssb.Append( @" select p from DALParty as p where p.OwnerID=:OwnerID ");
 85                 ssb.Append( "  and (p.Name like :Name  or p.Code like :Name or p.TaxCode like :Name) ");
 86                 ssb.Append( "  order by p.Name  ");
 87             }
 88         }
 89         [TestMethod]
 90          public  void StringBuilder100Test2()
 91         {
 92             StringBuilder ssb =  new StringBuilder();
 93              for ( int i =  0; i <  100; i++)
 94             {
 95                 ssb.Clear();
 96                 ssb.Append( @" select p from DALParty as p where p.OwnerID=:OwnerID ");
 97                 ssb.Append( "  and (p.Name like :Name  or p.Code like :Name or p.TaxCode like :Name) ");
 98                 ssb.Append( "  order by p.Name  ");
 99             }
100         }
101         [TestMethod]
102          public  void StringBuilder1000Test2()
103         {
104             StringBuilder ssb =  new StringBuilder();
105              for ( int i =  0; i <  1000; i++)
106             {
107                 ssb.Clear();
108                 ssb.Append( @" select p from DALParty as p where p.OwnerID=:OwnerID ");
109                 ssb.Append( "  and (p.Name like :Name  or p.Code like :Name or p.TaxCode like :Name) ");
110                 ssb.Append( "  order by p.Name  ");
111             }
112         }
113         [TestMethod]
114          public  void StringBuilder10000Test2()
115         {
116             StringBuilder ssb =  new StringBuilder();
117              for ( int i =  0; i <  10000; i++)
118             {
119                 ssb.Clear();
120                 ssb.Append( @" select p from DALParty as p where p.OwnerID=:OwnerID ");
121                 ssb.Append( "  and (p.Name like :Name  or p.Code like :Name or p.TaxCode like :Name) ");
122                 ssb.Append( "  order by p.Name  ");
123             }
124         }
125     }
View Code

 

测试结果如下:

String PK StringBuilder,传说就是传说,只有动手实验,才能得出确定的答案_第1张图片

 

根据测试结果如下:

 如果 字符串拼接 次数很小 <= 1000次,两者性能几乎没有差别,只有在字符本身长度大,拼接次数很大的情况下,使用StringBuilder才有意义。

 通过第二次方法测试可表明,在循环体内 每次 new StringBuilder 时,是非常耗时的工作,并且new时预分配内存,也是占内存的,有时并没有使用到。

 

因此:使用string 还是 StringBuilder 还要看使用环境。

在大部分情况下,string 并不会对性能造成损失,使用string 即方便,也经济,仍然是字符串操作的首先。

 

你可能感兴趣的:(String PK StringBuilder,传说就是传说,只有动手实验,才能得出确定的答案)