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开发之网络编程--3、NSURLSessionDataTask实现文件下载(离线断点续传下载)
前言:使用NSURLSessionDownloadTask满足不这个需要离线断点续传的下载需求,所以这里就需要使用NSURLSessionDataTask的代理方法来处理下载大文件,并且实现离线断点续 ...
- IOS-Swift、Objective-C、C++混合编程
1.Objective-C调用C++代码 后缀为m文件的是Objective-C的执行文件,而后缀为mm文件的是Objective-C++文件. 直接在Objective-C中是无法调用C++代码的, ...
- Swift中的数组
学习来自<极客学院:Swift中的字符串和集合> 工具:Xcode6.4 直接上基础的示例代码,多敲多体会就会有收获:百看不如一敲,一敲就会 import Foundation //数组: ...
- Resharper注册机实现以及源代码
一直用Resharper,每次找注册机也麻烦,就想怎么才能自己能做个注册机,把它原理给搞懂了,不就不用找了.今天早上起来研究了下Resharper注册机,网上找到一位大神之前做Resharper注册机 ...
- 怎样查看linux版本
玩一台新的linux服务器,首先要做的,就是先看下是什么版本的系统: 命令如下: 登录到linux执行cat /etc/redhat-release ,例如如下: [root@3.5.5Biz-46 ...
- android多种布局的列表实现
最近有一个列表效果,需要一个列表有多种布局,最终效果如下: 这个我也问了同事以及开发群里的朋友,居然都没得到最优的实现方式的回答,看来这种复杂列表的需求还是比较少的,我自己也走了一些弯路,把我几个实现 ...
- 用js获取当前页面的url的相关信息方法
当前页面对应的URL的一些属性: ( http://bbs.xxx.net/forum.php?mod=viewthread&tid=2709692&page=1&extra= ...
- 在SQL2008R2查询分析器出错(在执行批处理时出现错误。错误消息为: 目录名称无效。)
在用SQL2008R2查询分析器时 SELECT * FROM 表名; 出错: 在执行批处理时出现错误.错误消息为: 目录名称无效. 原因: 在打开查询分析器时,用360软件清空了临时文件(只是偶尔1 ...
- jquery-qrcode生成二维码
一.jquery-qrcode jquery-qrcode是一个为浏览器生成二维码的jquery插件.我们很容易将它集成到我们的应用.该插件也可以独立使用,也比较小.它是直接在客户端生成二维码生成.所 ...
- 认识与学习 BASH
2015-08-03摘自鸟哥 什么是变量? 那么,什么是『变量』呢?简单的说,就是让某一个特定字符串代表不固定的内容就是了.举个大家在国中都会学到的数学例子, 那就是:『 y = ax + b 』这东 ...