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

推荐订阅源

AI
AI
TaoSecurity Blog
TaoSecurity Blog
H
Heimdal Security Blog
Help Net Security
Help Net Security
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Microsoft Azure Blog
Microsoft Azure Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Google DeepMind News
Google DeepMind News
爱范儿
爱范儿
The Cloudflare Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
人人都是产品经理
人人都是产品经理
大猫的无限游戏
大猫的无限游戏
N
News | PayPal Newsroom
V2EX - 技术
V2EX - 技术
博客园 - 【当耐特】
D
Darknet – Hacking Tools, Hacker News & Cyber Security
S
Secure Thoughts
C
CERT Recently Published Vulnerability Notes
罗磊的独立博客
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
P
Privacy & Cybersecurity Law Blog
有赞技术团队
有赞技术团队
S
Schneier on Security
S
SegmentFault 最新的问题
Google Online Security Blog
Google Online Security Blog
H
Hacker News: Front Page
The Last Watchdog
The Last Watchdog
Schneier on Security
Schneier on Security
PCI Perspectives
PCI Perspectives
IT之家
IT之家
Project Zero
Project Zero
博客园 - 司徒正美
P
Privacy International News Feed
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Jina AI
Jina AI
Security Latest
Security Latest
Hacker News - Newest:
Hacker News - Newest: "LLM"
腾讯CDC
C
CXSECURITY Database RSS Feed - CXSecurity.com
阮一峰的网络日志
阮一峰的网络日志
C
Check Point Blog
aimingoo的专栏
aimingoo的专栏
V
Vulnerabilities – Threatpost
W
WeLiveSecurity
NISL@THU
NISL@THU
Webroot Blog
Webroot Blog
N
Netflix TechBlog - Medium
L
Lohrmann on Cybersecurity

博客园 - 杨义金

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 即方便,也经济,仍然是字符串操作的首先。