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

推荐订阅源

Hugging Face - Blog
Hugging Face - Blog
Jina AI
Jina AI
宝玉的分享
宝玉的分享
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
人人都是产品经理
人人都是产品经理
博客园 - 聂微东
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
J
Java Code Geeks
博客园 - 【当耐特】
小众软件
小众软件
博客园 - Franky
S
SegmentFault 最新的问题
WordPress大学
WordPress大学
雷峰网
雷峰网
The Cloudflare Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
量子位
Last Week in AI
Last Week in AI
博客园_首页
月光博客
月光博客
IT之家
IT之家
阮一峰的网络日志
阮一峰的网络日志
Webroot Blog
Webroot Blog
Stack Overflow Blog
Stack Overflow Blog
腾讯CDC
云风的 BLOG
云风的 BLOG
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
W
WeLiveSecurity
Recent Commits to openclaw:main
Recent Commits to openclaw:main
D
Docker
The Last Watchdog
The Last Watchdog
有赞技术团队
有赞技术团队
Hacker News - Newest:
Hacker News - Newest: "LLM"
D
DataBreaches.Net
S
Security @ Cisco Blogs
Blog — PlanetScale
Blog — PlanetScale
GbyAI
GbyAI
TaoSecurity Blog
TaoSecurity Blog
S
Security Affairs
Y
Y Combinator Blog
O
OpenAI News
罗磊的独立博客
MongoDB | Blog
MongoDB | Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Forbes - Security
Forbes - Security
P
Palo Alto Networks Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
K
Kaspersky official blog
Cloudbric
Cloudbric

博客园 - 杨义金

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