字元串優化

来源:https://www.cnblogs.com/x-zhi/archive/2023/04/21/17339209.html
-Advertisement-
Play Games

C#字元串優化學習總結 記憶體區域 我們知道一個由C/C++編譯的程式占用的記憶體分為以下幾個部分: 1、棧區(stack): 由編譯器自動分配釋放 ,存放函數的參數值,局部變數的值等。其操作方式類似於數據結構中的棧。 2、堆區(heap) : 一般由程式員分配釋放, 若程式員不釋放,程式結束時可能由O ...


C#字元串優化學習總結

記憶體區域

我們知道一個由C/C++編譯的程式占用的記憶體分為以下幾個部分:

1、棧區(stack): 由編譯器自動分配釋放 ,存放函數的參數值,局部變數的值等。其操作方式類似於數據結構中的棧。

2、堆區(heap) : 一般由程式員分配釋放, 若程式員不釋放,程式結束時可能由OS回收 。註意它與數據結構中的堆是兩回事,分配方式倒是類似於鏈表。

3、全局區(靜態區)(static):全局變數和靜態變數的存儲都是在一塊的,初始化的全局變數和靜態變數在一塊區域, 未初始化的全局變數和未初始化的靜態變數在相鄰的另一塊區域, 程式結束後有系統釋放 。

4、常量區:常量、字元串常量池就是放在這裡的, 程式結束後由系統釋放 。

5、程式代碼區:存放函數體的二進位代碼。

C#常量池

C#也有自己的常量池,也就是我們所稱的暫存池(string intern pool),C#的字元串常量池不在堆中也不在棧中,是獨立的記憶體空間管理,在記憶體的常量區,由CLR(Common Language Runtime)維護這段記憶體。

其中,我們定義的例如string a = "HelloWorld";"HelloWorld"這個我們定義的字面量就存儲在常量區中。如果再定義一個string b = "HelloWorld",這時候CLR就會去字元串常量池中找,如果存在相同內容的字元串對象的引用,則將這個引用返回。否則新的字元串對象被創建,然後將這個引用放入字元串常量池,並返回該引用。

關於常量池的理解:

  1. 常量池由CLR來維護,其中的所有字元串對象的值都不相同。

  2. 只有編譯階段的文本字元常量會被自動添加到常量池。

  3. 運行時期動態創建的字元串不會被加入到常量池中。

  4. string.Intern()可以把動態創建的字元串加入到常量池中。

即使這個動態創建的字元串和常量池中的某個字元串的值相等,引用也不會相等。

即使是動態創建的兩個字元串的值相等,他們的引用依然不相等。(charArray.ToString()特例)

字元串記憶體優化的核心原則有三個:

1、復用字元串,減少字元串數量

2、降低不可復用字元串的占用的記憶體

3、降低運行時產生的GC字元串記憶體

關於string拼接和StringBuilder拼接

1、在處理字元串時:string是只可讀不可寫的,在進行字元串拼接時,往往是創建一個string對象,然後棧中的記憶體指向堆中的新記憶體,在創建對象時需要分配記憶體空間,之前的記憶體則會產生GC。而StringBuilder是存在於System.Text命名空間下的在原來的記憶體中修改,不需要分配記憶體空間。
2、從記憶體優化方面來說,雖然StringBuilder在拼接後仍需要調用ToString()將拼接後的內容轉換成不可寫的字元串,但是相比較下來,頻繁的字元串操作StringBuilder更好。
3、從功能上來說string仍然比StringBuilder更強。
4、string主要用於公共API,通用性好,讀取性能高,占用記憶體小。
5、StringBuilder主要用於拼接string,修改性能好。
6、string是不可變的,所以天然線程同步。
7、StringBuilder可變,非線程同步。
如果是處理字元串的話,用string中的方法每次都需要創建一個新的字元串對象並且分配新的記憶體地址,而StringBuilder是在原來的記憶體里對字元串進行修改,所以在字元串處理方面還是建議用StringBuilder這樣比較節約記憶體。但是string類的方法和功能仍然還是比StringBuilder類要強。

關於string+int

string之所以可以與int相加,根本上是調用了Concat方法。首先intobject需要裝箱,然後Concat內部調用了所有objectToString方法,然後再new一個字元串返回。而Concat方法其實接受的是object類型的對象,這也就是說,string在與int相加的時候,會造成裝箱操作。而ToString()會產生28B的GC,裝箱會產生20B的GC,所以在拼接時,顯式的調用ToString()可以規避掉裝箱的過程,使用string+int.ToString()會比string+int更加節省性能

【字元串性能相關的操作】

1.創建空字元串用用string s = string.Empty,而不是string s = ""

2.高頻字元串拼接用stringbuilder,或者字元串格式化string.Format()string.Format()實際上就是利用stringbuilder去實現的

3.ToUpperToLower這類方法均會重新生成字元串,看看是否可以避免使用

4.true判斷時,用"value" == string是最快的;false判斷時,用"value".Equals(string)是最快的


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • springBoot自定義cron表達式註冊定時任務 一、原理 1、使用Spring自帶的TaskScheduler註冊任務 2、註冊後返回:ScheduledFuture,用於取消定時任務 3、註冊任務後不會馬上取消任務,所以將任務緩存。在需要取消任務的時候調用取消介面取消 4、cron表達式可以 ...
  • 本篇介紹了JVM中垃圾回收器相關的基礎知識,後續會深入介紹CMS、G1、ZGC等不同垃圾收集器的運作流程和原理,歡迎關註。 ...
  • 這輩子不想再看到jedisBrokenPipe!! 測試環境運行16天後報錯信息: 05:42:32.629 [http-nio-8093-exec-2] ERROR o.a.c.c.C.[.[.[.[dispatcherServlet] - [log,175] - Servlet.service( ...
  • chatGPT正式發佈已經有段時間了,這段時間我也深度體驗了chatGPT的魅力。 OpenAI除了提供網頁版的chatGPT,還通過api的形式提供了很多其它服務,包括文字糾錯、圖片生成、音頻轉換等等。 作為程式員,即使有現成的openai庫,但還是免不了想自己造輪子,所以就有這個openai庫。 ...
  • "If debugging is the process of removing software bugs, then programming must be the process of putting them in." - Edsger Dijkstra “如果調試是消除軟體Bug的過程,那 ...
  • 教程簡介 Windows通訊開發平臺(Windows Communication Foundation,簡稱WCF)是由微軟開發的一系列支持數據通信的應用程式框架,可以翻譯為Windows通訊開發平臺。 整合了原有的windows通訊的 .net Remoting,WebService,Socket ...
  • ###JWT的簡單使用 ####介紹 當今Web開發中,API的使用越來越廣泛,而API的安全性也變得越來越重要。其中,JWT(JSON Web Token)鑒權和授權是一種常見的解決方案。 本篇文章將會介紹JWT鑒權和授權的原理、實現方式以及註意事項。 ####什麼是JWT? JWT是一種基於JS ...
  • 介紹說明:這個幫助類包含了六個主要的方法:ExecuteNonQuery、ExecuteScalar、ExecuteQuery、ExecuteQuery(泛型)、Insert、Update和Delete。其中,ExecuteNonQuery用於執行不返回結果集的SQL語句;ExecuteScalar ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...