• 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 = 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#还是要比脚本语言效率高得多。

  • 相关阅读:
    【转】苹果App Store审核指南中文翻译(更新)
    ios中的coredata的使用
    iOS开发——网络编程OC篇&Socket编程
    [深入浅出Cocoa]iOS网络编程之Socket
    RESTful架构详解
    IOS开发 REST请求 ASIHTTPRequest用法
    iOS 8 AutoLayout与Size Class自悟
    nodejs入门demo
    微信公众号查询账户余额等
    微信公众号token验证失败的一些总结
  • 原文地址:https://www.cnblogs.com/timeObjserver/p/5993226.html
Copyright © 2020-2023  润新知