成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

介紹C#字符串的性能

開發 后端
本文介紹了C#字符串以及使用 String.Compare方法進行非大小寫敏感的C#字符串比較的相關內容。

簡介

你在代碼中處理C#字符串的方法可能會對性能產生令人吃驚的影響。程序中需要考慮兩個由于使用字符串而產生的問題:臨時字符串變量的使用和字符串連接。

背景知識

1.String是引用類型,在堆上分配內存。

2.String運算時會產生一個新的實例。當看到 myString.ToUpper() 時,我經常都會忘記它并不是改變 myString 的內容而是返回一整個全新的字符串(這是由于C# 字符串是不可變的)。

3.String 對象一旦生成不可改變(Immutable)。

4.定義相等運算符(== 和 !=)是為了比較 String 對象(而不是引用)的值。

String Comparison and Temporary String Creation

下面的例程是一個蹩腳的非大小寫敏感的字符串比較。用于比較的例程的代碼是: 

  1. static bool BadCompare(string stringA, string stringB)  
  2. {  
  3.     return (stringA.ToUpper() == stringB.ToUpper());  

對于這段代碼,FxCop 給出如下的建議:

 FxCop 給出如下的建議

這項建議的意思是每次對 ToUpper() 的調用都會創造一個臨時字符串,而這個臨時字符串是由垃圾收集器來創建和管理的。這需要額外的時間和使用更多的內存。 String.Compare 方法(相對來說)更加高效。

String Concatenation inside a loop

***那對測試例程設想字符串的連接是在一個循環里面進行的。

“蹩腳”的測試例程的代碼如下:

  1. static string BadConcatenate(string [] items)  
  2. {  
  3.     string strRet = string .Empty;  
  4.  
  5.     foreach (string item in items)  
  6.     {  
  7.         strRet += item;  
  8.     }  
  9.  
  10.     return strRet;  

當 FxCop 看到這段代碼,它就會很憤怒,甚至用紅色標記這項被破的規條! FxCop 這樣說道:

 FxCop 這樣說道:  

“優良”的測試例程的代碼如下:

  1. static string GoodConcatenate(string [] items)  
  2. {  
  3.     System.Text.StringBuilder builder = new System.Text.StringBuilder();  
  4.  
  5.     foreach (string item in items)  
  6.     {  
  7.         builder.Append(item);  
  8.     }  
  9.  
  10.     return builder.ToString();  

這段代碼幾乎被用作展示 System.Text.StringBuilder 的用法的***例子。蹩腳的代碼的問題是創建了過多的臨時字符串。由于字符串的不可變特性,連接操作符(+=)實際上用原來那兩個字符串來創建一個新的字符串,然后把原來的字符串實例指向這個新的字符串。

但是,依據 nprof 來研究代碼性能,我們發現運行 BadConcatenate 只需總執行時間的 5.67% ,而 GoodConcatenate 則是 22.09% 。也就是說:

使用 StringBuilder 耗費的時間幾乎是簡單的字符串連接的四倍!

為什么呢?

部分原因在于這個測試的設計——連接例程僅僅連接了十個簡短的字符串。 StringBuilder 是一個比簡單的不可變的字符串類更復雜的類,因此創建一個 StringBuilder 比起進行十個簡單的字符串連接在性能上是昂貴很多的。

我重復地做不同數目的字符串連接的測試,并且發現以下結果:

發現以下結果 

結論

使用 String.Compare 方法進行非大小寫敏感的C#字符串比較。這樣更快。而且代碼優雅和簡單。

僅當你在一個循環里進行超過 600 次的字符串連接時,使用 StringBuilder 來獲得更好的速度。這里需要提醒的是,你所處理的字符串的長度也會影響最終的速度,同樣會影響垃圾收集器的效果,所以你應該根據你實際的代碼具體問題具體分析

使用 StringBuilder 來處理字符串的連接應該是絕大多數 .NET 開發人員的共識了。但你有否曾經懷疑過這一經驗原則的適用性是否真如想象中那么廣泛呢?讀過本文后,或許你已經意識到這是個適度的問題。對小規模的字符串連接使用 StringBuilder 所帶來的改善根本不足以抵償因 StringBuilder 本身的復雜性所產生的開銷;只有當連接規模達到臨界規模,兩者才能相互抵償從而達至平衡。

【編輯推薦】

  1. 解密C#-SQLite是如何移植的
  2. 看看如何透過JavaScript調用C#函數
  3. 淺析C#事件注冊和注銷
  4. 示例:C#通過AMO對象瀏覽SQL SERVER 2005 SSAS
  5. C#隱藏窗口的幾種方法
責任編輯:book05 來源: cnblogs
相關推薦

2009-08-07 14:34:33

C#模式字符串

2009-08-26 13:24:54

C#字符串

2009-08-21 15:06:09

C#連接字符串

2009-09-02 17:44:41

C#字符串處理

2025-03-27 03:20:00

C#開發字符串

2009-08-06 16:01:09

C#字符串函數大全

2009-08-07 14:15:21

C#字符串分割

2009-08-07 14:22:56

C#字符串搜索

2009-08-24 17:06:37

C#字符串

2009-08-07 13:50:11

C#字符串

2009-08-24 13:04:44

操作步驟C#字符串

2009-08-07 14:46:59

C#匹配字符串

2024-12-23 07:38:20

2009-08-07 15:49:46

使用C#字符串

2009-08-06 17:24:08

C#字符串

2009-08-28 10:39:37

C#數值字符串

2009-08-07 15:58:54

C#字符串插入html

2009-09-02 13:41:57

C#字符串操作

2025-02-13 08:13:29

C#字符串拼接

2024-12-20 12:10:19

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 免费的av | 欧美不卡一区二区三区 | 99精品在线观看 | av毛片在线 | 久久亚洲视频 | 久久精品久久久久久 | 久久久久久国产精品 | 久久中文字幕一区 | 国产成人综合亚洲欧美94在线 | 亚洲一一在线 | 亚洲一区二区三区在线观看免费 | 成人免费在线小视频 | 久久久久久国产 | 久久综合狠狠综合久久综合88 | 色免费在线视频 | 久草热在线 | 国产精品久久久久久福利一牛影视 | 色婷婷精品久久二区二区蜜臂av | 欧美美乳 | 真人女人一级毛片免费播放 | 欧美日韩高清 | 欧美另类日韩 | 91精品国产91久久久久久吃药 | 日韩在线一区二区三区 | 欧美高清成人 | 欧美成人精品一区二区男人看 | 国产亚洲一区二区三区在线 | 久久久久亚洲精品中文字幕 | 国产欧美在线一区 | 男女免费在线观看视频 | 91麻豆精品国产91久久久久久 | 麻豆av一区二区三区久久 | 精品一二三 | 久久伊| 国产午夜精品一区二区三区在线观看 | 亚洲精品一区二区网址 | av一区二区三区四区 | 欧美中文一区 | 99久久久久久久久 | 亚洲视频在线看 | 精品国产91久久久久久 |