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 = 10000; string[] arrs = new string[num]; for(int i=0; i<arrs.Length; ++i) { arrs[i] = (i * i).ToString(); } swt.Start(); StringBuilder sbd = new StringBuilder(); for(int i=0; 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 = 0; 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=1, 10000 do strs[i] = tostring(i*i) end local str1 = "" print("---------------" .. os.clock()) --0.01 for i=1, 10000 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#还是要比脚本语言效率高得多。