• 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地址、拼接性能学习相关推荐

  1. String的底层分析 (学习笔记)

    StringTable底层分析 String的基本特性 StringPool String的内存分配 字符串的拼接操作 拼接效率的对比 intern()的理解 new String("&qu ...

  2. golang 字符串拼接性能比较

    背景 最近在做一个服务发现/注册的agent, 各个服务需要通过这个agent来注册自己的服务,在完成 开发后,测试性能时发现性能达不到要求,通过pprof 来确认cpu主要耗费在gc上,分析结果主要 ...

  3. go拼接字符串不如php,golang 字符串拼接性能的对比分析

    背景 最近在做一个服务发现/注册的agent, 各个服务需要通过这个agent来注册自己的服务,在完成 开发后,测试性能时发现性能达不到要求,通过pprof 来确认cpu主要耗费在gc上,分析结果主要 ...

  4. 【性能学习】性能测试基础

    学习链接:<性能学习实战30讲> 授课人:高楼 课程从三个部分进行阐述: 第一个模块是性能测试基础篇.在这个模块里澄清一些性能测试的基础概念,讲解一些关键部分.但并不是对概念的简单描述,而 ...

  5. C# string为什么可以与int相加? string字符串拼接深入分析

    目录 前言 字符串拼接 分析 新的问题 结论 最后 拓展一:与struct相加 拓展二:Java的底层实现 前言 最近在研究关于string的一些东西,发现底层实现挺有意思的,想来研究下string字 ...

  6. 优秀Android博客大全,整理了国内外大神博客/Github地址,是学习Android进阶的首选[转]

    [转]国内外优秀Android博客大全,覆盖了国内外大神博客地址,Github地址,是学习Android进阶的首选 国内: 昵称 Github 博客 介绍 邓凡平   http://blog.csdn ...

  7. JVM系列之:String.intern的性能

    文章目录 简介 String.intern和G1字符串去重的区别 String.intern的性能 举个例子 简介 String对象有个特殊的StringTable字符串常量池,为了减少Heap中生成 ...

  8. Vue本地图片循环加载显示不出来,vue img标签 :src地址拼接

    Vue本地图片循环加载显示不出来,vue img标签 :src地址拼接 上代码: <img:src="img"alt="banner" /> dat ...

  9. vue动态拼接图片路径、img地址拼接问题 [模板字符串]

    写vue写的不多,记录一下这个小坑 知识点:es6模板字符串${} (一)需求: 使用vue根据后端传的json数组的某一字段来拼接img的src路径,动态的绑定img标签的图片,图片来源本地文件夹, ...

最新文章

  1. oracel 不为null 保存空字符串
  2. SQL Server中CROSS APPLY和OUTER APPLY的应用详解
  3. ubuntu查看硬件信息
  4. .net 连接mysql的字符串_asp.net连接数据库字符串
  5. html table导出excel 插入图片_前端 Table 用 JS 导出EXCEL(支持大量数据,保留报表格式) - pensive2019...
  6. cocos2d-x返回Android游戏黑屏解决办法
  7. 这是一次 docker 入门实践
  8. LeetCode 1324. 竖直打印单词
  9. nginx cache配置
  10. 【数学】求三角形的外接圆圆心
  11. Filenet公布第二批打包节点竞选名单
  12. Android常用对话框大全——Dialog
  13. Neo4j 示例:三国志人物关系图谱
  14. Nginx实现域名跳转
  15. J2ME 发送彩信问题,请个位高手帮忙,长时间在线等待
  16. Flink 容错恢复 2.0 2022 最新进展
  17. 推荐一个Windows工具箱-云图工具箱
  18. 大数据产业到底是机遇还是陷阱?
  19. git找回删除的stash
  20. golang常见面试题总结

热门文章

  1. JAVA实现从尾到头打印链表(《剑指offer》)
  2. html表单注册功能的实现,仅一个form表单 js实现注册信息依次填写提交功能
  3. linux 下oracle 的kernel.shmmax,Linux 下kernel.shmmax 的设置问题
  4. 这个机器人一个表情,看过的人不寒而栗
  5. Waymo无人车高层动荡:CFO今日也走了,半年已失8名高管
  6. 40千克的镜子被量子力学“踢了一脚”,科学家首次发现宏观物体量子波动 | Nature...
  7. 大咖来信 | 微软中国CTO韦青:低代码/无代码时代来了,写代码的你准备好了吗?...
  8. 5.2 测试计划和估算
  9. ES学习笔记之-AvgAggregation的实现过程分析
  10. Yii2.0 连接数据库