1 string与stringbuilder

  并不是stringbuilder任何时候都在性能上占优势,在少量(大约个位数)的字符串时,并不比普通string操作快。

  string慢的原因不是string.conact(),而是string大量操作时,产生新的对象以及GC回收对象而造成的性能低下。

stringbuilder使用前,最好估算一下大约的长度,否则默认16。每次超过长度后将自动翻倍增长。

string.concat本质速度比stringbuider的append快,因为本质都是增加字符串数组,但是string.concat是已知数组长度,而append需要判断stringbuilder的长度是否满足,不满足需要申请一倍的内存。

  最本质的问题:string与stringbuilder是相同机制的,所有的内存都是可以修改的,而string是不允许使用者修改,并不表示.net自己不可以修改,这也是stringbuilder可以修改的原因,string.format是stringbuilder.append一样的方式。

  他们有两个属性,stringlength(字符串长度)与arrayLength(容器长度),string的容器长度只比stringlength多一个‘\0’,而stringbuilder则不一定,因为每次stringlength超过arraylength时,就会创建一个两倍于arraylength长度的对象,并把内容复制进去。

  stringbuilder.tostring()的机制:当stringlength小于arraylength一半时,为了节省内存而消耗性能,重新创建一个stringlength大小的对象,显示出来。如果大于一半了,则牺牲内存将当前容器显示出来,且将当前线程的指针指向zero,所以频繁的stringbuilder.tostring()会总是产生新的对象。

如果使用stringbuilder 一定要提前估算大概的长度,尽量少扩容,达到性能最优。

2019.03.19 读书笔记 string与stringbuilder的性能的更多相关文章

  1. 2019.04.19 读书笔记 比较File.OpenRead()和File.ReadAllBytes()的差异

    最近涉及到流的获取与转化,终于要还流的债了. 百度了一下,看到这样的两条回复,于是好奇心,决定看看两种写法的源码差异. 先来看看OpenRead() public static FileStream ...

  2. 2019.03.29 读书笔记 关于params与可选参数

    void Method1(string str, object a){} void Method2(string str, object a,object b) { } void Method3(st ...

  3. 2019.03.29 读书笔记 关于override与new

    差异:override:覆盖父类分方法,new 隐藏父类方法. 共同:都不能改变父类自身方法. public class Test { public string Name { get; set; } ...

  4. 2019.03.28 读书笔记 关于lock

    多线程就离不开lock,lock的本质是一个语法糖,采用了监视器Monitor. lock的参数,错误方式有很多种,只需要记住一种:private static readonly object loc ...

  5. 2019.03.28 读书笔记 关于try catch

    try catch 在不异常的时候不损耗性能,耗损性能的是throw ex,所以在非异常是,不要滥用throw,特别是很多代码习惯:if(age<0) throw new Exception(& ...

  6. 2019.03.26 读书笔记 关于 invoke与begininvoke

    invoke与begininvoke是同步委托和异步委托,但是有两种使用情况: 1. control中的invoke.begininvoke. 2. delegrate中的invoke.beginin ...

  7. 2019.03.22 读书笔记 var object dynamic

    var:语法糖,在编译时推断出类型,根据反编译可以看出.实际用处是增加代码的健壮性,比如 linq ,匿名对象等. object:很多人容易和var混淆,其实概念上完全不同,没什么可比性. dynam ...

  8. 2019.03.21 读书笔记 ==与Equals

    首先得出一个结论:==是比较变量内存的数据,Equals是值比较.但是他们都能被重写,所以object又增加了一个RefrenceEquals不可被重写,只比较数据: [ReliabilityCont ...

  9. 2019.03.20 读书笔记 关于Reflect与Emit的datatable转list的效率对比

    Reflect public static List<T> ToListByReflect<T>(this DataTable dt) where T : new() { Li ...

随机推荐

  1. netty源码阅读之UnpooledByteBufAllocator

    使用IDEA阅读源码Navigate下面的工具是个好东西 .可以帮助分析类的结构等 ByteBufAllocator主要用来生成三种ByteBuf :HeadBuffer,DirectBuffer,C ...

  2. LeetCode第110题:平衡二叉树

    问题描述 给定一个二叉树,判断它是否是高度平衡的二叉树. 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1. 示例 1: 给定二叉树 [3,9,20,nu ...

  3. [转]MYSQL5.7版本sql_mode=only_full_group_by问题

    转至:https://www.cnblogs.com/zhi-leaf/p/5998820.html 具体出错提示: [Err] 1055 - Expression #1 of ORDER BY cl ...

  4. Cookie seesion 赋值

    后台赋值: Session["uid"] = userid;//后台 后台取值: Label1.Text = Session["userid"].ToStrin ...

  5. 十天入门java教程 Day02

    1,常量,变量的理解 常量,程序运行过程中,不能改变的,叫常量. 变量,程序运行过程中,改变的,叫变量. 2,变量的理解 变量,用来存储数据的,数据类型,存放哪种数据的种类. 变量的概念:程序运行期间 ...

  6. ps 常用命令

    1.ps aux:显示所有进程信息 2.ps -u root:显示指定用户信息 3.ps -ef:显示所有进程信息,连同命令行 ps -ef|grep ssh 4.ps -axjf 显示程序树 5.p ...

  7. java基础之变量和常量、类型转换

    一.     变量 变量是可改变的量,每赋个值便会开辟一个新内存地址. 1.首先,变量需要一个声明,例如:int a,这个a也可以当作是一个标签,它指向了一个内存地址,这个地址是属于int类型的套餐, ...

  8. P4724 【模板】三维凸包

    \(\color{#0066ff}{题目描述}\) 给出空间中n个点,求凸包表面积. \(\color{#0066ff}{输入格式}\) 第一行一个整数n,表示点数. 接下来n行,每行三个实数x,y, ...

  9. linux 内核的 switch_to原理

    switch_to:这是一个宏,有三个参数prev,next,last 局部变量prev,next:指向进程描述符的内存地址 首先明确的是:last和prev是同一个,用last只是为了理解方便,完全 ...

  10. 黑马JavaScript学习一 BOM之Window对象定时器功能

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...