string与stringBuilder的效率与内存占用实测
- using UnityEngine;
- using System.Diagnostics;
- using System.Text;
- using UnityEngine.UI;
- public class simpleTest : MonoBehaviour {
- System.TimeSpan t1;
- System.TimeSpan t2;
- /// <summary>
- /// Main()会被UNITY调用!,只要名字是Main(),不管是public, static, void, int
- /// 当进行大量字符串连接时,string是stringBuilder内存占用的10倍以上,时间是其100倍以上
- /// vs2015控制台字符串连接速度是UNITY中字符串连接的10倍!
- /// </summary>
- void Main()
- {//*****此函数会被自动调用!! 在Awake()和Start()之间*******
- //通过这段代码对比可以发现,在数据量比较大时,string要比StringBuilder要慢得多,同时占用内存也大得多,数据越大差距越明显//测试环境:UNITY5.3.5F, VS2015
- //测试数据,10000次字符串连接
- //时间测试:UNITY5.3.5: t1 = 约1s, t2 = 约0.001s; VS2015: t1 = 0.08, t2 = 0.0001
- //内存测试:仅在VS2015中测试:string方式:运行程序约占11M,stringBuilder一直约保持在1400k~1800k
- Stopwatch swt = new Stopwatch();
- const int num = ;
- string[] arrs = new string[num];
- for(int i=; i<arrs.Length; ++i)
- {
- arrs[i] = (i * i).ToString();
- }
- swt.Start();
- StringBuilder sbd = new StringBuilder();
- for(int i=; i<num; ++i)
- {
- sbd.Append(arrs[i]);
- }
- swt.Stop();
- //UnityEngine.Debug.Log("stringBuilder: " + swt.Elapsed);
- t1 = swt.Elapsed;
- swt.Start();
- string s = "";
- for (int i = ; i < num; ++i)
- {
- s += arrs[i];
- }
- swt.Stop();
- UnityEngine.Debug.Log("string: " + swt.Elapsed);
- t2 = swt.Elapsed;
- UnityEngine.Debug.Log("ok");
- }
- void Reset(){
- UnityEngine.Debug.Log ("reset");
- }
- void Awake(){
- UnityEngine.Debug.Log ("awake");
- }
- // Use this for initialization
- void Start () {
- UnityEngine. Debug.Log ("start");
- GetComponent<Text> ().text = t1 + "," + t2;
- //Main ();
- }
- // Update is called once per frame
- void Update () {
- }
- }
在LUA中情况十分相似,在LUA中,字符串操作与C#完全一样,每次操作都会产生一个新串,大量字符串操作同样会产生大量内存占用。
在LUA中使用table.concat()来实现C#中stringbuilder()的功能,使字符串连接速度提升,内存减少。
经测试,在LUA中直接的字符串连接与使用table.concat()字符串进行连接时间在10000次操作时是100:1,与上面C#的对比基本一致。
- local strs = {}
- for i=, do
- strs[i] = tostring(i*i)
- end
- local str1 = ""
- print("---------------" .. os.clock()) --0.01
- for i=, do
- str1 = str1 .. strs[i]
- end
- print("----------------" .. os.clock()) --0.139
- print("---------------" .. os.clock()) --0.139
- local str2 = table.concat(strs)
- print("----------------" .. os.clock()) --0.141
另外,10000次字符串连接测试,table.concat与 C#的stringbuilder()对比,时间占用 10:1。说明C#还是要比脚本语言效率高得多。
string与stringBuilder的效率与内存占用实测的更多相关文章
- Java基础 String/StringBuff/StringBuilder 常用操作方法复习/内存分析/三者的效率比较
附:jdk1.8使用IDEA安装.创建.使用JUnit单元测试 笔记总结: /**String 复习 * 1.像C++这样的char arr[]="..." 的方式无法声明Java ...
- JAVA中,字符串STRING与STRINGBUILDER的效率差异
如果可变字符串操作较多的话,用STRINGBUILDER显然优势得多. public class HelloJava { public static void main(String[] args) ...
- java 中String与StringBuilder 效率
之前印象中string与stringbuilder操作时,如果多次改变string就使用stringbuilder,效率会提高: 今天实际遇到了问题,亲身经历过之后,这性能不是一般的影响啊:不是同一个 ...
- C#的StringBuilder 以及string字符串拼接的效率对照
今天公司一个做Unity3d的人在说字符串拼接的一个效率问题,他觉得string拼接会产生新的一个内存空间,假设不及时回收会产生大量的碎片,特别是在Unity3d这样一个Updata环境下,由于每一帧 ...
- JVM系列之:String,数组和集合类的内存占用大小
目录 简介 数组 String ArrayList HashMap HashSet LinkedList treeMap 总结 简介 之前的文章中,我们使用JOL工具简单的分析过String,数组和集 ...
- String+,StringBuilder,String.format运行效率比较
实现String字符串相加的方法有很多,常见的有直接相加,StringBuilder.append和String.format,这三者的运行效率是有差异的,String是final类型的,每次相加都会 ...
- .Net中String和StringBuilder的区别
String对象是不可变的而StringBuilder则不是这样,可以方便的Append进行扩展. 比如:string aa="123456",那么aa就会在内存中占用一块能放下这 ...
- highcharts 大数据 String+,StringBuilder,String.format运行效率比较
实现String字符串相加的方法有很多,常见的有直接相加,StringBuilder.append和String.format,这三者的运行效率是有差异的,String是final类型的,每次相加都会 ...
- 从.Net版本演变看String和StringBuilder性能之争
在C#中string关键字的映射实际上指向.NET基类System.String.System.String是一个功能非常强大且用途非常广泛的基类,所以我们在用C#string的时候实际就是在用.NE ...
随机推荐
- Quartz 2d绘图
今天看了一下Quartz 2D绘图,我只想说:不要把绘图和动画那些东西当做一个很复杂的东西,其实只要你认真看还是可以理解的.他们并不难.啰嗦了几句,现在直接进入正题: 前提是我们必须新建一个singl ...
- 【读书笔记】iOS-GCD-系统提供的dispatch方法
系统提供的dispatch方法如下: //系统提供的dispatch方法 //后台执行: dispatch_async(dispatch_get_global_queue(0, 0), ^{ // s ...
- SQL JOIN
- IOS开发中(null)与<null>的处理
不小心在开发过程中,得到了(null)以及<null>的返回值,找了好长时间只找到了一个关于<null>的. 由于要根据返回值进行判断,做出必要反应,因此必须知道返回值所代表的 ...
- iOS App打包流程
1.什么是打包 将应用程序统一放在一个后缀是ipa的文件中,然后发给其他人,可以安装在手机上供用户或测试人员安装 2.可安装ipa的前提 ①说清楚是哪一个应用程序(App Id) ②可以安装在哪一台设 ...
- C语言-06-复杂数据类型
一.数组 1> 数组的定义和初始化 定义 ① 数组定义了同种类型数据的集合 ② 定义数组时,数组必须有固定的长度 初始化 ① 如果在定义数组时,初始化数组,数组元素的个数必须是常量 ② 如果不在 ...
- C语言---文件
1. 需要了解的概念 包括:数据流.缓冲区.文件类型.文件存取方式 1.1 数据流: 指程序与数据的交互是以流的形式进行的.进行C语言文件的存取时,都会先进行“打开文件”操作,这个操作就是在打开数据流 ...
- 【SVN】Unable to connect to a repository at URL 'svn://localhost/Test'
早上配置SVN,但是这次不是那么顺利... 环境: Windows 7 SVN服务器端:CollabNetSubversion-server-1.8.13-1 SVN客户端:TortoiseSVN_V ...
- Java Concurrency In Practice -Chapter 2 Thread Safety
Writing thread-safe code is managing access to state and in particular to shared, mutable state. Obj ...
- SQL2014内存表性能之内存中 OLTP 的性能改进测试
先贴1个例子,后续补充完整的测试例子.... 1.用MSDN例子测试一下 use master go --1.先创建包含内存优化文件组的数据库 CREATE DATABASE imoltp2 ON P ...