您的位置:首页 > 产品设计 > UI/UE

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

2014-08-24 21:21 260 查看
本机测试结果如下:

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

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

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

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

第一种方法:

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 }
}
[TestMethod]
public void StringBuilder1000Test2()
{
StringBuilder ssb = new StringBuilder();
for (int i = 0; i < 1000; i++)
{
ssb.Clear();
ssb.Append(@"select p from DALParty as p where p.OwnerID=:OwnerID");
ssb.Append(" and (p.Name like :Name or p.Code like :Name or p.TaxCode like :Name)");
ssb.Append(" order by p.Name ");
}
}
[TestMethod]
public void StringBuilder10000Test2()
{
StringBuilder ssb = new StringBuilder();
for (int i = 0; i < 10000; i++)
{
ssb.Clear();
ssb.Append(@"select p from DALParty as p where p.OwnerID=:OwnerID");
ssb.Append(" and (p.Name like :Name or p.Code like :Name or p.TaxCode like :Name)");
ssb.Append(" order by p.Name ");
}
}
}View Code

测试结果如下:



根据测试结果如下:

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

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

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

在大部分情况下,string 并不会对性能造成损失,使用string 即方便,也经济,仍然是字符串操作的首先。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐