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 = 0; i < num; i++){str += i.ToString();}}public static void StringBuilderTest(int num){StringBuilder builder = new StringBuilder();for(int i = 0; i < num; i++){builder.Append(i.ToString());}string str = builder.ToString();}
测试代码:
int num = 1000;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 < 1000000);
测试结果:
结果表明:大量字符串连接性能很差,这当然是由string类型值不可变特性确定的,解决方案是采用stringbuilder代替。
转载于:https://www.cnblogs.com/fuxuyang/p/8979676.html
C#String地址、拼接性能学习相关推荐
- String的底层分析 (学习笔记)
StringTable底层分析 String的基本特性 StringPool String的内存分配 字符串的拼接操作 拼接效率的对比 intern()的理解 new String("&qu ...
- golang 字符串拼接性能比较
背景 最近在做一个服务发现/注册的agent, 各个服务需要通过这个agent来注册自己的服务,在完成 开发后,测试性能时发现性能达不到要求,通过pprof 来确认cpu主要耗费在gc上,分析结果主要 ...
- go拼接字符串不如php,golang 字符串拼接性能的对比分析
背景 最近在做一个服务发现/注册的agent, 各个服务需要通过这个agent来注册自己的服务,在完成 开发后,测试性能时发现性能达不到要求,通过pprof 来确认cpu主要耗费在gc上,分析结果主要 ...
- 【性能学习】性能测试基础
学习链接:<性能学习实战30讲> 授课人:高楼 课程从三个部分进行阐述: 第一个模块是性能测试基础篇.在这个模块里澄清一些性能测试的基础概念,讲解一些关键部分.但并不是对概念的简单描述,而 ...
- C# string为什么可以与int相加? string字符串拼接深入分析
目录 前言 字符串拼接 分析 新的问题 结论 最后 拓展一:与struct相加 拓展二:Java的底层实现 前言 最近在研究关于string的一些东西,发现底层实现挺有意思的,想来研究下string字 ...
- 优秀Android博客大全,整理了国内外大神博客/Github地址,是学习Android进阶的首选[转]
[转]国内外优秀Android博客大全,覆盖了国内外大神博客地址,Github地址,是学习Android进阶的首选 国内: 昵称 Github 博客 介绍 邓凡平 http://blog.csdn ...
- JVM系列之:String.intern的性能
文章目录 简介 String.intern和G1字符串去重的区别 String.intern的性能 举个例子 简介 String对象有个特殊的StringTable字符串常量池,为了减少Heap中生成 ...
- Vue本地图片循环加载显示不出来,vue img标签 :src地址拼接
Vue本地图片循环加载显示不出来,vue img标签 :src地址拼接 上代码: <img:src="img"alt="banner" /> dat ...
- vue动态拼接图片路径、img地址拼接问题 [模板字符串]
写vue写的不多,记录一下这个小坑 知识点:es6模板字符串${} (一)需求: 使用vue根据后端传的json数组的某一字段来拼接img的src路径,动态的绑定img标签的图片,图片来源本地文件夹, ...
最新文章
- oracel 不为null 保存空字符串
- SQL Server中CROSS APPLY和OUTER APPLY的应用详解
- ubuntu查看硬件信息
- .net 连接mysql的字符串_asp.net连接数据库字符串
- html table导出excel 插入图片_前端 Table 用 JS 导出EXCEL(支持大量数据,保留报表格式) - pensive2019...
- cocos2d-x返回Android游戏黑屏解决办法
- 这是一次 docker 入门实践
- LeetCode 1324. 竖直打印单词
- nginx cache配置
- 【数学】求三角形的外接圆圆心
- Filenet公布第二批打包节点竞选名单
- Android常用对话框大全——Dialog
- Neo4j 示例:三国志人物关系图谱
- Nginx实现域名跳转
- J2ME 发送彩信问题,请个位高手帮忙,长时间在线等待
- Flink 容错恢复 2.0 2022 最新进展
- 推荐一个Windows工具箱-云图工具箱
- 大数据产业到底是机遇还是陷阱?
- git找回删除的stash
- golang常见面试题总结
热门文章
- JAVA实现从尾到头打印链表(《剑指offer》)
- html表单注册功能的实现,仅一个form表单 js实现注册信息依次填写提交功能
- linux 下oracle 的kernel.shmmax,Linux 下kernel.shmmax 的设置问题
- 这个机器人一个表情,看过的人不寒而栗
- Waymo无人车高层动荡:CFO今日也走了,半年已失8名高管
- 40千克的镜子被量子力学“踢了一脚”,科学家首次发现宏观物体量子波动 | Nature...
- 大咖来信 | 微软中国CTO韦青:低代码/无代码时代来了,写代码的你准备好了吗?...
- 5.2 测试计划和估算
- ES学习笔记之-AvgAggregation的实现过程分析
- Yii2.0 连接数据库