Unity優(yōu)化——字符串篇

處理字符串和文本是Unity項目中性能問題的常見來源迂猴。在C#中,所有的字符串都是不可變的。對字符串的任何操作都將導(dǎo)致分配一個完整的新字符串躺屁。

當(dāng)連接N個字符串的時候,會有N-1中間字符串分配经宏,依次連接也會給內(nèi)存管理帶來壓力犀暑。對于需要進(jìn)行連接的字符串,推薦用StringBuild去減傷內(nèi)存分配烁兰。一個StringBuild的實例可以重復(fù)使用耐亏,進(jìn)一步減少內(nèi)存分配。

重復(fù)字符串

在查看Mono內(nèi)存的時候發(fā)現(xiàn)字符串是內(nèi)存的使用大頭沪斟,發(fā)現(xiàn)里面會存在很多重復(fù)的字符串广辰。這些字符串都是運行時創(chuàng)建的,因為沒有消除重復(fù)導(dǎo)致占用大量內(nèi)存主之。

當(dāng)讀取一個N行的文件择吊,每行的內(nèi)容都是一樣的時候,這個字符串會再內(nèi)存中創(chuàng)建N份槽奕。推薦用String.Intern & String.IsInterned來管理字符串几睛。對所有創(chuàng)建出來的常駐String做一次String.Intern操作,則可以使所有字符串唯一粤攒。對非常駐的String所森,我們可以自己創(chuàng)建一個StringPool來維護(hù)唯一字符串,在合適的時機釋放這個Pool清理內(nèi)存夯接。

字符串比較

在字符串相關(guān)代碼中經(jīng)常發(fā)現(xiàn)的核心性能問題之一是使用默認(rèn)的慢速API焕济。這些API接口的默認(rèn)行為是能處理不同文化與語言規(guī)則的字符串。

    string separated = "\u0061\u030a";
    string combined = "\u00e5";
    Console.WriteLine(String.Compare(separated, combined) == 0);
    // result is True
    Console.WriteLine(String.Compare(separated, combined, StringComparison.Ordinal) == 0);
    // result is False

復(fù)雜的規(guī)則必然帶來的是執(zhí)行的不高效盔几,而且這功能在大部分的Unity工程里面是不需要的晴弃。

低效的字符串API

寫了一個簡單的腳步測試字符串API的速度

    StringBuilder sBuilder = new StringBuilder();
    System.Random random = new System.Random();
    for (int i = 0; i < 100; ++i)
    {
       sBuilder.Append((char)(random.Next() % 256));
    }
    string str = sBuilder.ToString();
    string preStr = str.Substring(0, 16);
    string lastStr = str.Substring(str.Length - 16, 16);
    int cnt = 0;
    for (int i = 0; i < 100 * 1024; ++i)
    {
        if (str.StartsWith(preStr)) ++cnt;
        if (str.StartsWith(lastStr)) ++cnt;
    }

測試結(jié)果

Method Time(ms) 100k compares
String.StartsWith,default culture 360ms
String.EndsWith,default culture 12465ms
String.StartsWith,Ordinal 357ms
String.EndsWith,Ordinal 174ms
CustomStartsWith 18ms
CustomEndsWith 17ms

字符串比較接口默認(rèn)行為

Func Name Default interpretation
String.Compare StringComparison.CurrentCulture
String.CompareTo StringComparison.CurrentCulture
String.Equals StringComparison.Ordinal
String.ToUpper StringComparison.CurrentCulture
Char.ToUpper StringComparison.CurrentCulture
String.StartsWith StringComparison.CurrentCulture
String.IndexOf StringComparison.CurrentCulture
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市问欠,隨后出現(xiàn)的幾起案子肝匆,更是在濱河造成了極大的恐慌,老刑警劉巖顺献,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件旗国,死亡現(xiàn)場離奇詭異,居然都是意外死亡注整,警方通過查閱死者的電腦和手機能曾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進(jìn)店門度硝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人寿冕,你說我怎么就攤上這事蕊程。” “怎么了驼唱?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵藻茂,是天一觀的道長。 經(jīng)常有香客問我玫恳,道長辨赐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任京办,我火速辦了婚禮掀序,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘惭婿。我一直安慰自己不恭,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布财饥。 她就那樣靜靜地躺著换吧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪佑力。 梳的紋絲不亂的頭發(fā)上式散,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天,我揣著相機與錄音打颤,去河邊找鬼暴拄。 笑死,一個胖子當(dāng)著我的面吹牛编饺,可吹牛的內(nèi)容都是我干的乖篷。 我是一名探鬼主播,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼透且,長吁一口氣:“原來是場噩夢啊……” “哼撕蔼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起秽誊,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤鲸沮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后锅论,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體讼溺,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年最易,在試婚紗的時候發(fā)現(xiàn)自己被綠了怒坯。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炫狱。...
    茶點故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖剔猿,靈堂內(nèi)的尸體忽然破棺而出视译,到底是詐尸還是另有隱情,我是刑警寧澤归敬,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布酷含,位于F島的核電站,受9級特大地震影響弄慰,放射性物質(zhì)發(fā)生泄漏第美。R本人自食惡果不足惜蝶锋,卻給世界環(huán)境...
    茶點故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一陆爽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧扳缕,春花似錦慌闭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至粥庄,卻和暖如春丧失,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背惜互。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工布讹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人训堆。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓描验,卻偏偏與公主長得像,于是被迫代替她去往敵國和親坑鱼。 傳聞我的和親對象是個殘疾皇子膘流,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法鲁沥,內(nèi)部類的語法呼股,繼承相關(guān)的語法,異常的語法画恰,線程的語...
    子非魚_t_閱讀 31,645評論 18 399
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理彭谁,服務(wù)發(fā)現(xiàn),斷路器阐枣,智...
    卡卡羅2017閱讀 134,672評論 18 139
  • 熬過了寒冬 你以為 春就來了 可眼看到山花爛漫了 卻聞不到 春的芬芳 你以為 走過黑暗 黎明就在前方 可陰云依舊籠...
    瓶水之冰閱讀 197評論 0 1
  • 前段時間有一群關(guān)注公益的人來柴火拜訪马靠,他們會給一些因為殘疾或者什么原因而造成了一些生活上的困難的人做一些小東西奄抽,來...
    劍山閱讀 602評論 0 51
  • 一次員工培訓(xùn)會快進(jìn)行到尾聲時,小靈講了一件事:有一次她有事不服想找經(jīng)理投訴及辯論甩鳄,在辦公室門外她看見了經(jīng)理正在行走...
    明茗女性說說閱讀 451評論 5 8