三大类库(一)之字符串性能分析

一、分析

String类字符串追加

  当我们对字符串进行拼接时,String:是对象不是原始类型.为不可变对象,一旦被创建,就不能修改它的值.对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去.String 是sealed 类,即不能被继承.

    string是String类的别名,引用类型,且该类型是只读的,不可修改,当你修改字符串内容时,实际上是创建了另一个新的字符串并将引用指向了它,你可以参考String类型的构造函数说明,就明白错在哪里了。第一条只是创建了一个String类型的数组,并未对其初始化,如果你对该数组中的任一成员使用第二条的方法进行初始化,一样会报错。

str += "a";等效于:str = new StringBuffer(str).append("a").toString(); 虽然编译器对字符串加号做了优化,它会用StringBuffer的append方法进行追加。再是通过toString方法转换成String字符串的。 它与纯粹的append方法是不同的:

一是每次都要创建一个StringBuilder对象;

二是每次执行完毕都要调用toString方法将其转换为字符串。

  因此,字符串类型的字符追加有可能会消耗大量的时间,因为每次追加完成之后都要return返回一个新的字符串,每次的操作都会创建一个新的String对象,这就是直接使用速度慢下来的原因。

StringBuffer的字符串追加

StringBuffer:是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象,它只能通过构造函数来建立,StringBuffer sb = new StringBuffer();它不能直接对其进行赋值操作,sb = "I Hava a Dream";//错误,对象被建立以后,在内存中就会分配内存空间,并初始保存一个null.向StringBuffer中赋值的时候可以通过它的append方法.sb.append("当然的");

StringBuilder
-> 字符串不可变,长期拼接字符串性能较低
-> Stringbuilder
Append(string);
AppendLine(string);
AppendFormat("{0}{1}{2}{3}", 1, "23", "ab", true);
ToString();

所以它必须通过追加的方式进行赋值。它的内部实现代码如下:

 1 public AbstractStringBuilder append(String str){
 2     //如果是null值,则把null作为字符串处理
 3     if(str == null)str = "null";
 4
 5     int len = str.length();
 6     //字符串的长度为0,则返回自身
 7     if(len == 0)return this;
 8
 9     int newCount = count + len;
10     //追加后的字符串组长度是否超过当前值
11     if(newCount > value.length)
12         expandCapacity(newCount);//加长,并作数组拷贝
13     //字符串复制到目标数组
14     str.getChars(0, len, value, count);
15     count = newCount;
16
17     return this;
18 } 

在StringBuffer中进行追加时不需要建立新的对象,开辟新的空间,它始终是一个对象,而String 对象是不可变对象,每次操作Sting 都会重新建立新的对象来保存新的值.
这样原来的对象就没用了,就要被垃圾回收.这也是要影响性能的。

二、场景模拟

我们使用Stopwatch类分别对这两种情况进行模拟计时,在C#中有一个秒表类:stopwatch,用这个类可以方便的测试一下代码运行时间。

 1 Stopwatch sp=new Stopwatch();
 2 sp.start();
 3 string s="";
 4 for(int i=0;i<100000;i++)
 5 {
 6         s+=i.toString();
 7 }
 8 sp.Stop();
 9 Console.WriteLine(sp.Elapsed);
10 Console.ReadKey();

结果表明:时间花了30多秒 

而对于StringBuilder:

 1 Stopwatch sp=new Stopwatch();
 2  sp.start();
 3  StringBuilder sb=new StringBuilder();
 4  for(int i=0;i<100000;i++)
 5  {
 6          s+=sb.Append(i.toString());
 7  }
 8  sp.Stop();
 9 Console.WriteLine(sp.Elapsed);
10  Console.ReadKey();

结果表明:时间花了0.几秒,相差了两个数量级

三、结论

当我们的系统性能不临界的时候,string类型的简答追加比较接地气,符合人们通常的写代码的习惯,而当系统性能临界,我们要进行数量级比较大的循环,我们就应该使用StringBuilder,提高我们的代码优化。

时间: 2024-10-16 11:37:42

三大类库(一)之字符串性能分析的相关文章

关于Boost,C Regex对短目标字符串正则匹配的性能分析

昨天对长目标字符串下的各种正则匹配库性能进行了总结,得出结论是Boost regex性能最佳.今天将其应用到项目当中,果不其然,长字符串匹配带来的性能损失基本没有了,当然,目前规模并不算太大,但是在可预计规模内Boost可以完全达到要求. 不过有一点,在Boost,C同时去除长字符串匹配的影响后,剩下都是短字符串匹配,发现Boost比C好的并不是好很多,例如10000+次短字符匹配中,其中包含匹配成功和不成功的,Boost regex+系统其他模块用时130ms左右,而C regex+系统其他模

C#中判断空字符串的3种方法性能分析

3种方法分别是:string a="";1.if(a=="")2.if(a==String.Empty)3.if(a.Length==0) 3种方法都是等效的,那么究竟那一种方法性能最高呢?本人用实验说明问题. 建立3个aspx页面(为什么用网页,主要是利用Microsoft Application Center Test ) WebForm1.aspxprivate void Page_Load(object sender, System.EventArgs e)

C 中判断空字符串的3种方法性能分析【月儿原创】

C#中判断空字符串的3种方法性能分析 作者:清清月儿 主页:http://blog.csdn.net/21aspnet/           时间:2007.4.28  3种方法分别是:string a="";1.if(a=="")2.if(a==String.Empty)3.if(a.Length==0) 3种方法都是等效的,那么究竟那一种方法性能最高呢?本人用实验说明问题. 建立3个aspx页面(为什么用网页,主要是利用Microsoft Application

mysql索引结构原理、性能分析与优化

原文  http://wulijun.github.com/2012/08/21/mysql-index-implementation-and-optimization.html 第一部分:基础知识 索引 官方介绍索引是帮助MySQL高效获取数据的数据结构.笔者理解索引相当于一本书的目录,通过目录就知道要的资料在哪里, 不用一页一页查阅找出需要的资料. 唯一索引(unique index) 强调唯一,就是索引值必须唯一. 创建索引: create unique index 索引名 on 表名(列

向mysql中批量插入数据的性能分析

MYSQL批量插入数据库实现语句性能分析 假定我们的表结构如下 代码如下   CREATE TABLE example (example_id INT NOT NULL,name VARCHAR( 50 ) NOT NULL,value VARCHAR( 50 ) NOT NULL,other_value VARCHAR( 50 ) NOT NULL) 通常情况下单条插入的sql语句我们会这么写: 代码如下   INSERT INTO example(example_id, name, valu

代码性能分析

代码性能优化 优化是对代码进行等价变换,使得变换后的代码运行结果与变换前的代码运行结果相同,但执行速度加快或存储开销减少. 代码性能优化是一门复杂的学问. 根据 80/20 原则,实现程序的重构.优化.扩展以及文档相关的事情通常需要消耗80% 的工作量. 在满足正确性.可靠性.健壮性.可读性等质量因素的前提下,设法提高程序的效率 以提高程序的全局效率为主,提高局部效率为辅 在优化程序效率时,应先找出限制效率的“瓶颈” 先优化数据结构和算法,再优化执行代码 时间效率和空间效率可能是对立的,应当分析

由浅入深探究mysql索引结构原理、性能分析与优化

转载自:http://www.phpben.com/?post=74 第一部分:基础知识: 索引 官方介绍索引是帮助MySQL高效获取数据的数据结构.笔者理解索引相当于一本书的目录,通过目录就知道要的资料在哪里,不用一页一页查阅找出需要的资料.关键字index ------------------------------------------------------------- 唯一索引 强调唯一,就是索引值必须唯一,关键字unique index 创建索引: 1.create unique

UIWebView、WKWebView使用详解及性能分析

一.整体介绍 UIWebView自iOS2就有,WKWebView从iOS8才有,毫无疑问WKWebView将逐步取代笨重的UIWebView.通过简单的测试即可发现UIWebView占用过多内存,且内存峰值更是夸张.WKWebView网页加载速度也有提升,但是并不像内存那样提升那么多.下面列举一些其它的优势: 更多的支持HTML5的特性 官方宣称的高达60fps的滚动刷新率以及内置手势 Safari相同的JavaScript引擎 将UIWebViewDelegate与UIWebView拆分成了

Oracle性能分析工具介绍及使用

oracle数据库级别优化分析工具介绍 当我们对数据库优化诊断时,需要收集相应的信息以供参考,从个人的使用经验来说,这种统计数据分为两大类 一类是数据库级别的统计信息二类是os级别的统计信息 下面就分别介绍在不同的级别下,常用什么工具来收集信息帮助优化诊断 首先是oracle数据库级别优化分析工具介绍 目录: 1.statspack2.ASH3.AWR4.ORACLE EXPLAIN PLAN的总结(查询sql的执行计划)   a.autotrace   b.explain的使用 1.stats