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#還是要比腳本語言效率高得多。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM