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 ...
随机推荐
- GCD编程 之 略微提高篇
额外任务:学习YouXianMing封装好的GCD源码 1.GCD串行队列与并发队列 串行队列一次只执行一个线程,按照添加到队列的顺序依次执行 并发队列一次可以执行多个线程,线程的执行没有先后 ...
- Linux线程学习(二)
线程基础 进程 系统中程序执行和资源分配的基本单位 每个进程有自己的数据段.代码段和堆栈段 在进行切换时需要有比较复杂的上下文切换 线程 减少处理机的空转时间,支持多处理器以及减少上下文切换开销, ...
- 高点击率的Banner设计14招
英文原文:14 design tips for more clickable banner ads 译文:http://www.uisdc.com/banner-click-rate 虽然互联网发展迅 ...
- 使用Httpclient来替代客户端的jsonp跨域解决方案
最近接手一个项目,新项目需要调用老项目的接口,但是老项目和新项目不再同一个域名下,所以必须进行跨域调用了,但是老项目又不能进行任何修改,所以jsonp也无法解决了,于是想到了使用了Httpclient ...
- nginx的配置总结
总体而言,nginx的配置比起apache来是要简洁很多,而言容易理解得多的,另外官网的文档也十分的简洁易懂.我们先看一个简化版的配置文件nginx.conf: #user nobody; worke ...
- 被废弃的 Thread.stop, Thread.suspend, Thread.resume 和Runtime.runFinalizersOnExit
最近学习多线程的知识,看到API里说这些方法被废弃了,就查了一下原因 Thread.stop 这个方法会解除被加锁的对象的锁,因而可能造成这些对象处于不一致的状态,而且这个方法造成的ThreadDea ...
- find命令中参数perm的用法
按照文件权限模式用-perm选项,按文件权限模式来查找文件的话.最好使用八进制的权限表示法.如在当前目录下查找文件权限位为755的文件,即文件属主可以读.写.执行,其他用户可以读.执行的文件,可以用: ...
- html点击按钮 弹出 多选择窗口级联下拉复选
参考代码 代码示例1: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:/ ...
- 初学嵌入式STM32基础下选哪款开发板适合学习
iTOP-4412开发板 目前为止,在用户网盘上已经积累了多达100G以上资料, 这些资料都是和4412相关的,并不是随便拼凑起来的!同时我们也完全开放原厂资料. 鉴于用户对于海量资料无从下手的问题, ...
- NOIP2007 T1奖学金 解题报告-S.B.S.
洛谷P1093 题目描述 某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金.期末,每个学生都有3门课的成绩:语文.数学.英语.先按总分从高到低排序,如果两个同学总分相同, ...