惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

MongoDB | Blog
MongoDB | Blog
宝玉的分享
宝玉的分享
博客园 - 三生石上(FineUI控件)
小众软件
小众软件
罗磊的独立博客
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
S
SegmentFault 最新的问题
Last Week in AI
Last Week in AI
人人都是产品经理
人人都是产品经理
博客园 - 聂微东
博客园 - 司徒正美
博客园 - 叶小钗
T
Tailwind CSS Blog
博客园 - Franky
V
V2EX
有赞技术团队
有赞技术团队
美团技术团队
雷峰网
雷峰网
爱范儿
爱范儿
Jina AI
Jina AI
D
DataBreaches.Net
H
Help Net Security
酷 壳 – CoolShell
酷 壳 – CoolShell

博客园 - 杨义金

Csla One or more properties are not registered for this type unomp 矿池运行问题随记 矿池负载运行监测记录 MySql 数据库移植记录 后台服务运行后无故停止运行,原因不明 缓存过期时间的设置 Bitcoin 使用及配置记录 关于 CSLA 服务器部署WCF访问出错的问题 AR 不同 继承映射的问题总结 当事人角色 变更映射策略引起的问题 Castle ActiveRecord 二级缓存使用 异常记录 VS2013 抛出 stackoverflow exception 的追踪 CastleActiveRecord在多线程 事务提交时数据库资源竞争导致更新失败的测试结果记录 WF4.0 工作流设计器 传入参数问题记录? Solving GitHub FetchHead (MergeConflict) in Visual Studio 2013 昆明光标科技有限公司简介 Castle.ActiveRecord 多对多关系 引发的错误处理 .net mvc Bundle 问题解决方案 .net 4.0 自定义本地缓存策略的不同实现
String PK StringBuilder,传说就是传说,只有动手实验,才能...
杨义金 · 2014-08-24 · via 博客园 - 杨义金

本机测试结果如下:

大部分情况下,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

测试结果如下:


根据测试结果如下:

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

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

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

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