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 ...
随机推荐
- 【读书笔记】iOS-NSString的length
NSString的length方法能够准确无误地处理国际字符串,如含有俄文,中文或者日本文字符的字符串,以及使用Unicode国际字符标准的字符串.在C语言中处理这些国际字符串是件令人非常头疼的事情 ...
- iOS提醒用户进入设置界面进行重新授权通知定位等功能
iOS 8及以上版本最不为人知的一个特点是与应用设置的深层链接,用户可以根据APP的需要授权启用位置.通知.联系人.相机.日历以及健康等设置. 大多数应用程序仅仅是弹出一个包含操作指令的警示窗口,如“ ...
- Android bitmap高效显示和优化
第一部分:Bitmap高效显示 应用场景:有时候我们想在界面上显示一个网络图片或者显示一张本地的图片,但是图片本身是很大的有几兆,但是显示的位置很小或者说我们可以用更小的图片来满足这样的需求,如果把整 ...
- 浅谈 sql 中数据的约束
数据约束 --对用户操作表的数据进行约束 1.默认值 --当用户对使用默认值的字段不插入值的时候,就使用默认值 1)对默认值字段插入null是可以的. 2)对默认值字段可以插入非null [例如:ad ...
- mybatis java.lang.UnsupportedOperationException
mybatis抛出下面的异常: org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exc ...
- js中location.href的用法
Javascript中的location.href有很多种用法,主要如下: self.location.href="/url" 当前页面打开URL页面 ocation.href=& ...
- 烂泥:【解决】ubuntu使用远程NFS报错
本文由秀依林枫提供友情赞助,首发于烂泥行天下. 今天在ubuntu系统上使用远程NFS,发现一直报错无法使用. 查看NFS挂载命令没有错误,命令如下: mount -t nfs 192.168.1.1 ...
- 续Gulp使用入门-综合运用>使用Gulp构建一个项目
这是我的文件目录结构图 下面是我gulpfile.js的配置 'use strict' var gulp=require('gulp'); var gutil=require('gulp-util' ...
- 移动web在ios和android下点击元素出现阴影问题
移动web开发经验总结 1.-webkit-tap-highlight-color:rgba(255,255,255,0)可以同时屏蔽ios和android下点击元素时出现的阴影.备注:transp ...
- Learning C Struct
为什么需要结构体类型? 一种语言本身往往会提供一些最基本的数据类型,比如数字型(int,bigint,float,double等),字符型,日期型,布尔型等.但现实世界中,我们面对的对象总是非常复常, ...