unity string優(yōu)化

string的用法

例子1
  var str1 = "a"+1;   //存在裝箱,效率低   string 是引用類型   數(shù)值是值類型
   var str2 = "a" + 1.ToString();//效率更高

例子2
var str1 = "a";
str1 += "b";//又創(chuàng)建了2個(gè)字符串對(duì)象溉旋,并且執(zhí)行了一次string.Contact方法
var str2 = "a" + "b";//字符串不會(huì)在運(yùn)行時(shí)進(jìn)行拼接,而是會(huì)在編譯時(shí)直接生成一個(gè)字符串喊递,等效于 str="ab";效率更高

string s1 = "a";
string s2 = "b";
var str1 = s1 + s2;
var str2 =  String.Format("字符1 {0}, 字母2 {1}", s1, s2);//效率高

例子3
string s1 = "a";
string s2 = "b";
var str1 = s1 + s2;
var str2 =  String.Format("字符1 {0}, 字母2 {1}", s1, s2);//效率高

例子4
var str1 = "a";
str1 += "b";
str1 += "c";
str1 += "d";
//效率更高肯污,尤其是在處理大量字符串的時(shí)候或者是在循環(huán)里面
var str2 = new System.Text.StringBuilder("a");
str2.Append("b");
str2.Append("c");
str2.Append("d");

這樣寫法效率不高的原因:

  1. 裝箱
  2. 避免分配額外的內(nèi)存空間
  3. 使用“+”連接字符串

詳細(xì)解析

1.string 是屬于引類型 整數(shù)類型在與字符串進(jìn)行拼接操作時(shí),并不默認(rèn)調(diào)用ToString()方法,存在裝箱
2.string 它一旦被賦值就不可改變咆爽,所以“+”或者“=”都會(huì)在內(nèi)存中創(chuàng)建一個(gè)新的字符串對(duì)象霞赫,這也意味著要為該新對(duì)象分配新的內(nèi)存空間腮介。
3.String.Format是將指定的 String 類型的數(shù)據(jù)中的每個(gè)格式項(xiàng)替換為相應(yīng)對(duì)象的值的文本等效項(xiàng)。同樣端衰,我也可以用來(lái)拼接字符串叠洗,并且效率高于“+”
4.StringBuilder是可變長(zhǎng)度的,其首先在內(nèi)存中分配固定的長(zhǎng)度旅东,當(dāng)進(jìn)行頻繁的插入和連接操作時(shí)灭抑,超出了內(nèi)存中分配的長(zhǎng)度會(huì)自動(dòng)進(jìn)行擴(kuò)充,從而有效的節(jié)約了內(nèi)存空間和減少了生成對(duì)象的時(shí)間抵代。

image.png

腳本:

  private float num = 2000;
    private void Update()
    {
        Normal();
        Test_1();
        Test_2();
        Test_3();
        Test_4();
        Test_5();
    }

    string s1 = string.Empty;
    private void Normal()
    {
        Profiler.BeginSample("string++");
        s1 = string.Empty;
        for (int i = 0; i < num; i++)
        {
            s1 += i;
        }
        Profiler.EndSample();
    }

    StringBuilder stringBuilder_1=new  StringBuilder();
    private void Test_1()
    {
        Profiler.BeginSample("stringBuilder");
        stringBuilder_1.Remove(0, stringBuilder_1.Length);
        for (int i = 0; i < num; i++)
        {
            stringBuilder_1.Append(i);
        }

        Profiler.EndSample();
    }

    /// <summary>
    /// string.Concat每次使用都會(huì)重新生成一個(gè)string腾节,然后對(duì)其進(jìn)行數(shù)據(jù)填充。
    /// </summary>
    private void Test_2()
    {
        Profiler.BeginSample("string.Concat");
        string s1 = string.Concat("txt_pre_", Random.Range(0,100), "_end");
      //  Debug.Log(s1);
        Profiler.EndSample();
    }

    /// <summary>
    /// string.Format每次使用都會(huì)重新生成一個(gè)string荤牍,然后對(duì)其進(jìn)行數(shù)據(jù)填充案腺。
    /// </summary>
    private void Test_3()
    {
        Profiler.BeginSample("string.Format");
        string s2 = string.Format("txt_pre_{0}_end", Random.Range(0, 100),"_end");
        Profiler.EndSample();
    }

    /// <summary>
    ///  StringBuilder AppendFormat每次使用都會(huì)重新生成一個(gè)string,然后對(duì)其進(jìn)行數(shù)據(jù)填充参淫。
    /// </summary>
    StringBuilder stringBuilder_2 =new  StringBuilder();
    private void Test_4()
    {
        Profiler.BeginSample("StringBuilder.AppendFormat");
        stringBuilder_2.Remove(0, stringBuilder_2.Length);
        stringBuilder_2.AppendFormat("txt_pre_{0}_end", Random.Range(0, 100), "_end");
        Debug.Log(stringBuilder_2);
        Profiler.EndSample();
    }

    private void Test_5()
    {
        Profiler.BeginSample("string+num");
        for (int i = 0; i < num; i++)
        {
            var str2 = "a" + i;
        }
        Profiler.EndSample();
        Profiler.BeginSample("string+string");
        for (int i = 0; i < num; i++)
        {
            var str2 = "a" + i.ToString();
        }
        Profiler.EndSample();
    }

參考:
https://blog.csdn.net/onelei1994/article/details/101054633

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末救湖,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子涎才,更是在濱河造成了極大的恐慌鞋既,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件耍铜,死亡現(xiàn)場(chǎng)離奇詭異邑闺,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)棕兼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門陡舅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人伴挚,你說(shuō)我怎么就攤上這事靶衍。” “怎么了茎芋?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵颅眶,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我田弥,道長(zhǎng)涛酗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮商叹,結(jié)果婚禮上燕刻,老公的妹妹穿的比我還像新娘。我一直安慰自己剖笙,他們只是感情好卵洗,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著枯途,像睡著了一般忌怎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上酪夷,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天榴啸,我揣著相機(jī)與錄音,去河邊找鬼晚岭。 笑死鸥印,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的坦报。 我是一名探鬼主播库说,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼片择!你這毒婦竟也來(lái)了潜的?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤字管,失蹤者是張志新(化名)和其女友劉穎啰挪,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嘲叔,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡亡呵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了硫戈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锰什。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖丁逝,靈堂內(nèi)的尸體忽然破棺而出汁胆,到底是詐尸還是另有隱情,我是刑警寧澤霜幼,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布沦泌,位于F島的核電站,受9級(jí)特大地震影響辛掠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一萝衩、第九天 我趴在偏房一處隱蔽的房頂上張望回挽。 院中可真熱鬧,春花似錦猩谊、人聲如沸千劈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)墙牌。三九已至,卻和暖如春暗甥,著一層夾襖步出監(jiān)牢的瞬間喜滨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工撤防, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留虽风,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓寄月,卻偏偏與公主長(zhǎng)得像辜膝,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子漾肮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353