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 ...
随机推荐
- [linux]CentOS无法使用epel源
[linux]CentOS无法使用epel源 问题的产生与解决 作者作为Android应用开发者,对linux的接触一直是ubuntu为主,但是有一个用于科学上网的vps,由于内存只有64M,所以使用 ...
- Instruments指南:如何调试内存泄露
Instruments指南:如何调试内存泄露 开篇 现在,你应该使用的ARC,而不是原来我们使用的MRC或者其他.但是我们在使用ARC的时候也会出现内存泄露的情况. 幸运的是,苹果为我们提供了Inst ...
- 自定义Dialog以及Dialog返回值到Activity
步骤: 1.定义自定义的Dialog的布局文件 2.写一个类MyDialog继承Dialog 3.Dialog 返回值到Activity的方法是定义一个接口,接口中定义返回值到Activity的方法, ...
- 斯坦福iOS7公开课4-6笔记及演示Demo
1.变量类型别滥用id,如果不仔细容易在程序执行时引发错误,因为在编译阶段编译器只是检测变量对象所属类型,尤其是类型为id时代表任何类型都可以通过检查,但不会检测变量对象调用的方法,这样当对象所属类不 ...
- IOS之资源收集--很好的github网址
1.Nick Jensen 2.关于直播的
- genymotion虚拟机启动失败
错误提示如下: Make sure that you have installed it correctly before starting Genymotion. 解决方法(重启VirtualBox ...
- Method threw 'org.hibernate.exception.SQLGrammarException' exception. Cannot evaluate com.hotel.Object_$$_jvst485_15.toString()
数据库字段和类Object属性不匹配,Method threw 'org.hibernate.exception.SQLGrammarException' exception. Cannot eval ...
- [Weblogic]如何清理缓存
背景:在开发调试或测试时,很多时候重新更新部署服务后会发现某些更新并没有体现到,还是之前的情况,也或者会出现其他错误问题,这个时候就要考虑到可能是weblogic缓存未清理引起. 清理缓存步骤如下: ...
- javascript/jquery 常见功能实现(持续更新...)
1. input 只能输入整数数字和字母 $(document).on('keyup','#no',function(){ var val = $.trim($(this).val()); if(va ...
- 烂泥:ubuntu中使用virt-manager图形化新建虚拟机
本文由秀依林枫提供友情赞助,首发于烂泥行天下. 上一篇文章介绍了,如何在ubuntu下安装KVM的虚拟机管理器virt-manager,这篇文章我们来介绍,如何在图形界面下使用virt-manager ...