C#String地址、拼接性能学习
- String类型不可变。定义string变量时会在堆上分配存储空间,而对该变量进行值变更时会重新分配一个存储空间,且保留原存储空间。
测试思路:获取string类型变量值变更前后的存储空间地址,判断地址是否相同。
获取引用类型地址代码:
public static string GetMemory(Object o)
{
GCHandle h = GCHandle.Alloc(o, GCHandleType.Pinned);
IntPtr addr = h.AddrOfPinnedObject();
return "0x" + addr.ToString("X");
}
测试代码:
string str= "hello";
Console.WriteLine(GetMemory(str));
str = "hi";
Console.WriteLine(GetMemory(str));
测试结果:

测试表明:string类型变量赋值完成后一旦修改值,实际上是重新分配一存储空间存储修改的值,原来的存储空间保留并保存原值。也就证明所谓的“string类型值不可变”。
- string字符串拼接性能测试。通过循环模拟实现字符串拼接,并将所运行时间与stringbuilder实现相同功能所需时间对比。
public static void StringConcat(int num)
{
string str = "";
for(int i = ; i < num; i++)
{
str += i.ToString();
}
}
public static void StringBuilderTest(int num)
{
StringBuilder builder = new StringBuilder();
for(int i = ; i < num; i++)
{
builder.Append(i.ToString());
}
string str = builder.ToString();
}
测试代码:
int num = ;
do
{
int start = Environment.TickCount;
/******使用字符串连接构建字符串******/
StringConcat(num);
int middle = Environment.TickCount; /******使用StringBuilder构建字符串******/
StringBuilderTest(num);
int end = Environment.TickCount; int t1 = middle - start;
int t2 = end - middle;
Console.WriteLine("循环次数:{0},StringBuilder:{1}ms,字符串拼接:{2}ms", num, t2, t1);
num = (int)(num * 1.5);
} while (num < );
测试结果:

结果表明:大量字符串连接性能很差,这当然是由string类型值不可变特性确定的,解决方案是采用stringbuilder代替。
C#String地址、拼接性能学习的更多相关文章
- 从.Net版本演变看String和StringBuild性能之争
在C#中string关键字的映射实际上指向.NET基类System.String.System.String是一个功能非常强大且用途非常广泛的基类,所以我们在用C#string的时候实际就是在用.NE ...
- 从.Net版本演变看String和StringBuilder性能之争
在C#中string关键字的映射实际上指向.NET基类System.String.System.String是一个功能非常强大且用途非常广泛的基类,所以我们在用C#string的时候实际就是在用.NE ...
- C# String 字符拼接测试(“+”、string.Format、StringBuilder 比较)
对于字符串的拼接自己一直有疑问,在何时该用什么方法来拼接?哪种方法更好.更适合. 几种方法 1.“+” 拼接字符串 现在在 C# 中,字符串进行拼接,可以直接用 “+” 而且可以直接用于数字类型的而不 ...
- C#的StringBuilder 以及string字符串拼接的效率对照
今天公司一个做Unity3d的人在说字符串拼接的一个效率问题,他觉得string拼接会产生新的一个内存空间,假设不及时回收会产生大量的碎片,特别是在Unity3d这样一个Updata环境下,由于每一帧 ...
- scrapy爬取数据的基本流程及url地址拼接
说明:初学者,整理后方便能及时完善,冗余之处请多提建议,感谢! 了解内容: Scrapy :抓取数据的爬虫框架 异步与非阻塞的区别 异步:指的是整个过程,中间如果是非阻塞的,那就是异步 ...
- 【转载】 C#使用String.Format拼接字符串
在C#程序开发过程中,很多时候会使用字符串拼接,最简单的字符串拼接操作就是所有的字符串使用加号+相加连接起来,但这种代码形式非常不适合代码维护阅读,尤其是拼接字符串语句比较复杂的时候,如拼接SQL语句 ...
- JVM系列之:String.intern的性能
目录 简介 String.intern和G1字符串去重的区别 String.intern的性能 举个例子 简介 String对象有个特殊的StringTable字符串常量池,为了减少Heap中生成的字 ...
- String使用拼接对性能的影响和原因。
需要频繁的拼接String的时候,使用\'+\'拼接会影响性能,应该用StringBuilder或者StringBuffer的append反方法来拼接,从执行速度上来讲:StringBuilder & ...
- C# 字符串拼接性能探索 c#中+、string.Concat、string.Format、StringBuilder.Append四种方式进行字符串拼接时的性能
本文通过ANTS Memory Profiler工具探索c#中+.string.Concat.string.Format.StringBuilder.Append四种方式进行字符串拼接时的性能. 本文 ...
随机推荐
- Git的三种区域
Git的区域分为 工作区.缓存区.本地仓库区 我们先看一张图 GitTest是我本地的一个仓库, 其中GitTest目录就是我们的工作区,但不包括.git这个目录 而.git这个目录就是本 ...
- log4cpp第一个程序HelloWord
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...
- 将VS2010环境设置为VC6.0样式(字体、前景色、背景色、Visual Assist X等)
一.设置字体. 使用字体:Fixedsys Excelsior 3.01. 步骤1:下载字体. 步骤2:安装字体,控制面板->字体,复制下载的字体进去. 步骤3:打开VS2010,选择菜单:To ...
- 对于get方法是否需要synchronized修饰
具体用法没有总结,只是说明一个用法而已,对于以前个人理解出现的偏差 [问题描述] 对于一个计数功能的实现,获取值的方法是否需要加锁? [以前理解] 我只需要在进行累加的方法上进行加锁即可,这样保证其可 ...
- 设计 react 组件
重新设计 React 组件库 诚身 7 个月前 在 react + redux 已经成为大部分前端项目底层架构的今天, 让我们再次回到软件工程界一个永恒问题的探讨上来, 那就是如何提升一个开发团队 ...
- PostgreSQL统计信息挖掘
PG提供了丰富的统计信息,但是没有将这些统计信息使用的简单查询搞成存储过程,需要我们自己根据需要灵活的去挖掘,最近做了数据库监控,用了一些简单的东西,于是想往深了挖一下. 首先看看系统表和视图,他们都 ...
- 编写configure.ac
configure.ac由一些宏组成(如果已经有源代码,你可以运行autoscan来产生一个configure.scan文件,在此基础修改成configure.ac将更加方便) 最基本的组成可以是下面 ...
- swift metal ios8 关键字.
swift metal ios8 关键字. 4000API. 无所谓谁打败谁吧. 行业内用户用的多 资源多 问题容易解决. 今年明显unity 火热程度非常. 然,万变不离其中. 对于游戏产品来说, ...
- js之敏感词过滤
HTML <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <titl ...
- Redis安全性配置
最近Redis刚爆出一个安全性漏洞,我的服务器就“光荣的”中招了.黑客攻击的基本方法是: 扫描Redis端口,直接登录没有访问控制的Redis 修改Redis存盘配置:config set dir / ...