C#中判斷空字符串的3種方法性能分析

C#中判斷空字符串的3種方法性能分析

3種方法分別是:
string a="";
1.if(a=="")
2.if(a==String.Empty)
3.if(a.Length==0)

3種方法都是等效的,那麼究竟那一種方法性能最高呢?本人用實驗說明問題。

建立3個aspx頁面(爲什麼用網頁,主要是利用Microsoft Application Center Test

WebForm1.aspx
private void Page_Load(object sender, System.EventArgs e)
  {
   string a="";
   for(int i=0;i<=1000000;i++)
   {
    if(a=="")
    {
    }
   }
  }

WebForm2.aspx
private void Page_Load(object sender, System.EventArgs e)
  {
   string a="";
   for(int i=0;i<=1000000;i++)
   {
    if(a==String.Empty)
    {
     
    }
   }
  }

WebForm3.aspx
private void Page_Load(object sender, System.EventArgs e)
  {
   string a="";
   for(int i=0;i<=1000000;i++)
   {
    if(a.Length==0)
    {
    }
   }
  }

 在Microsoft Application Center Test 下建立3個壓力測試項目:

測試結果:

WebForm1.aspx----------if(a=="")


WebForm2.aspx-------if(a==String.Empty)


WebForm3.aspx-------if(a.Length==0)

所以3種方法量化的結果是98,105,168:

方法 結果 if(a=="") 98 if(a==String.Empty) 105 if(a.Length==0) 168

那麼爲什麼if(a.Length==0)最快呢?
因爲整數判斷等於最快,沒有經過實例化等複雜的過程。

所以:建議大家判斷字符串是否爲空用 if(a.Length==0)。

 ------------------------------------------------------------------------------

String.IsNullOrEmpty的源碼:

public static bool IsNullOrEmpty(string value)
{
if (value != null)
{
return (value.Length == 0);
}
return true;
}

 

VS2005 代碼分析中,會給出如下提示。


警告 13 CA1820 : Microsoft.Performance : 使用 String.IsNullOrEmpty 調用替換“InSideUI.GetVideoPaginationSqlText(String, Int32, Int32):String”中對 String.op_Inequality(String.Empty) 的調用。 i:/wwwroot/App_Code/InSideUI.cs 74 http://localhost/
==================

很明顯。微軟的建議,用String.IsNullOrEmpty。

----------------------------------------------------------

#   excel06 發表於2007-04-28 11:46:45  IP: 58.34.253.*
對於三種方法的評價:

1.if(a=="") // ""需要實例化一個String對象,最差
2.if(a==String.Empty) // String.Empty是常量,不需要實例化
3.if(a.Length==0) // a.Length雖然最快,但是語意不如第2種清晰

另,String.IsNullOrEmpty(value)判斷的是該字符串是非爲空,或者爲空字符串.

結論:推薦使用2.if(a==String.Empty),安全,穩定,語意清晰.

-----------------------------------------------------------

#   Hello 發表於2007-04-28 10:04:58  IP: 60.20.148.*
又一個誤入歧途的程序員,而且還搞錯了概念,csdn還放到首頁,充分說明csdn的技術越來越爛,作爲一個技術社區網站,頁面竟然做的這麼爛,還好意思出來

 

#   zzzzz 發表於2007-04-28 10:28:34  IP: 218.65.129.*
String.IsNullOrEmpty(value)


#   excel06 發表於2007-04-28 11:46:45  IP: 58.34.253.*
對於三種方法的評價:

1.if(a=="") // ""需要實例化一個String對象,最差
2.if(a==String.Empty) // String.Empty是常量,不需要實例化
3.if(a.Length==0) // a.Length雖然最快,但是語意不如第2種清晰

另,String.IsNullOrEmpty(value)判斷的是該字符串是非爲空,或者爲空字符串.

結論:推薦使用2.if(a==String.Empty),安全,穩定,語意清晰.

 

 

#   全球 發表於2007-04-28 17:06:12  IP: 202.104.245.*
垃圾們,人家這樣辛苦的研究是對學術一絲不苟的表現,學編程是細節化的東西,不是研究出了什麼,而是一種研究的思路,以後如果遇到這樣的問題樓主的做法自然有值得借鑑的地方 ,你們這些垃圾,不懂就別亂吹.
還有那個
if(a + ""=="")好像很牛似的,如果a是null,你的代碼就沒問嗎??你用a+""其實就是多此一舉,不但無效,反而誤導人家,降低代碼效率.


豬頭們,醒醒吧,中國軟件行業的未來靠你們!呵呵

 

#   全球 發表於2007-04-28 17:08:42  IP: 202.104.245.*
寫代碼爲什麼需要架構師和程序員呢??

架構師責任是設計優秀的軟件架構.
程序員是編寫優秀的代碼.

你們到底站在什麼樣的角度看問題?是不是你們的角度都有問題啊?你說是不是?你敢說不是嗎?

 

 


#   DeViLIvy 發表於2007-04-28 20:09:09  IP: 61.186.105.*
String.IsNullOrEmpty的源碼:

public static bool IsNullOrEmpty(string value)
{
if (value != null)
{
return (value.Length == 0);
}
return true;
}
-------------
我一般也用String.IsNullOrEmpty

 

#   abc 發表於2007-04-28 21:11:28  IP: 121.34.46.*
還是要支持以下樓主,很多寫web出身的人不會理解這些優化的意義,但是如果寫系統軟件的話,這些優化有時是必不可少的。
舉個例子:
將10個小字符串累加起來形成一條長字符串,如果你用了9個“+”號的話,那你的程序能賣出去纔怪。

 

#   未名 發表於2007-04-28 22:25:38  IP: 219.137.160.*
將10個小字符串累加起來形成一條長字符串,如果你用了9個“+”號的話,那你的程序能賣出去纔怪。
那要怎麼樣纔好啊

 

#   nov30th 發表於2007-04-29 00:41:51  IP: 60.186.190.*
===================================


簡直阿!!!!!!


不知道作者有沒有在項目作《〈〈〈代碼分析〉〉〉》

----------------------------------------------------------------

 

VS2005 代碼分析中,會給出如下提示。


警告 13 CA1820 : Microsoft.Performance : 使用 String.IsNullOrEmpty 調用替換“InSideUI.GetVideoPaginationSqlText(String, Int32, Int32):String”中對 String.op_Inequality(String.Empty) 的調用。 i:/wwwroot/App_Code/InSideUI.cs 74 http://localhost/
==================

很明顯。微軟的建議,用String.IsNullOrEmpty。

無知者無罪。

希望作者通過這些評論瞭解到真正的方法。

另外,建議你要求性能和穩定性上作文章,要經常進行“代碼分析”來糾正錯誤。這是VS2005裏面不錯的一個功能。

 

#   phommy 發表於2007-04-29 09:05:51  IP: 218.57.140.*
VS2005 代碼分析中```

請問一下,代碼分析在哪個菜單裏?我找遍了系統菜單也沒找到...

 

#   fei0504 發表於2007-04-29 09:20:21  IP: 220.152.160.*
如果a=" "中間有好多空格呢?a.length還是0嗎?

 

#   diandian82 發表於2007-04-29 12:11:16  IP: 131.107.0.*
一堆白癡啊,這種比較是很長用的,如果在大量的循環裏面使用是非常能改善性能的,其實這個性能的差異我早知道,不過第一次看到樓主把他寫出來,非常不錯。

那些覺得沒必要的,你們根本不是合格的程序員,如果世界上沒有.net,你們是第一批被淘汰的程序員。都是被寵壞的孩子。

建議在學校先學學C++吧。

樓上那個更白癡,居然還問這種問題“如果a=" "中間有好多空格呢?a.length還是0嗎?”

好好問問你自己吧

 

#   nnnd 發表於2007-04-29 12:42:06  IP: 203.86.30.*
>># 未名 發表於2007-04-28 22:25:38 IP: 219.137.160.*
>>將10個小字符串累加起來形成一條長字符串,如果你用了9個“+”號的話,那你的程序能賣出去纔怪。
>>那要怎麼樣纔好啊

用九個+號的話會造成產生9個臨時的字符串對象,需要分配10次內存空間,垃圾回收器要回收9次。

當然先分配一段緩存,再把10個字符串複製過去啦,簡單講就是用StringBuilder或String.Join來並接

這些算是基礎的知識了。

 

#   xiaobingyang 發表於2007-04-29 12:42:58  IP: 220.249.10.*
請使用中國人開發的C/C++編譯器、網頁瀏覽器內核
該軟件下載地址:
http://www.nila.com.cn/yczip.zip
 

 

#   nnnd 發表於2007-04-29 12:44:54  IP: 203.86.30.*
對於樓主提到的 somevar.Length==0 的方法,基本上什麼語言都是這樣判斷的,無論是vb6,java,.net,而不僅僅限制於c#,但是如果不是很確定somevar是否爲null,使用 somevar==string.Empty也是一個不錯的方法。

 

#   sunruping 發表於2007-04-29 13:00:09  IP: 61.237.230.*
大家的評價就不能中肯一點嗎?樓主的思路是對的,別總是盯着這一點去看。

 

#   Xiang_Dui 發表於2007-04-29 13:14:14  IP: 218.20.56.*
>># 未名 發表於2007-04-28 22:25:38 IP: 219.137.160.*
>>將10個小字符串累加起來形成一條長字符串,如果你用了9個“+”號的話,那你的程序能賣出去纔怪。
>>那要怎麼樣纔好啊

用九個+號的話會造成產生9個臨時的字符串對象,需要分配10次內存空間,垃圾回收器要回收9次。

當然先分配一段緩存,再把10個字符串複製過去啦,簡單講就是用StringBuilder或String.Join來並接

這些算是基礎的知識了。

-------------------------------------------------------------------

如果 10 個小字符串是常量的話, 編譯器會做優化, 編譯時會合併成一個............ 不要將編譯器看得這麼爛...... 一般來說, 將一個大串分拆成幾個小串來用"+"來連接, 目的是讓代碼容易讀, 放在一行容易看得頭暈.....

如果是變量的話, 那就要用 StringBuilder 或 String.Join....

 

 

#   henry 發表於2007-04-29 13:21:56  IP: 59.41.147.*
測試方式就用問題,ACT本身開銷就很大,IIS開開銷也很大。
如果都是在同一臺PC上那這個結果根本沒有可參考性,因爲影響結果並不只是那個string操作的方法。
用.NET2.0的System.Diagnostics.Stopwatch進行測試一下吧.

 

#   smartstar2005 發表於2007-04-29 13:42:37  IP: 61.196.247.*
老大,你搞笑吧

你那樣會死掉的

 

#   BlueTrees 發表於2007-04-29 13:49:59  IP: 60.176.207.*
string.lenght 語義是清晰的。

這沒什麼錯,但是不太符合習慣。習慣是可以培養的。

空字符串的語義是長度爲0的字符串,直接判斷長度是沒錯的。

唯一的毛病就是null,null的語義是空對象,如果可以把空對象賦值給string類型,那麼說明,string類型必須能夠解釋null類型含義。

null類型就是無類型,它不含字符串長度這樣的定義。所以string對null進行解釋的時候必須要進行類型匹配。如果把null解釋成爲長度爲0的字符串也是不合理的。必須進行特殊的解釋。

如果string對null進行了特殊的解釋,那麼使用長度來判斷是否空字符的語義就是不正確的。

空字符串的語義就應當是,除了null之外長度爲0的字符串,或者說具有長度屬性但是爲0的字符串。

增加一個判斷就會增加一次開銷,實際上在使用string.empty的時候,運算符重載的函數會進行null判斷,然後判斷長度。如果左側的string爲null就不會調用那個重載的運算符判斷。

如果string.length判斷增加了類型檢查,那麼效率等同於string.empty的判斷。

之所以效率高,是因爲TZ對空字符串的理解存在缺陷。

 

#   phommy 發表於2007-04-29 15:46:03  IP: 218.57.140.*
我爲什麼不用 String.IsNullOrEmpty:
因爲這是一個靜態函數,如樓上所說,用起來不習慣。
如果給出一個動態(靜態的反義詞是動態麼?)重載,我肯定會用了

偏偏C#規定,點操作的左值必須不爲null,即使它的類型確定也不可以。所以那個“動態”的重載是不可能寫得出來的

所以,我還是按我從VB6裏帶來的習慣,用 str+""=="" 來進行比較,只是習慣而已。
而且,str+""的寫法可以省掉非常非常多的 if 語句,誰用誰知道:)

 

#   danjiewu 發表於2007-04-30 09:00:39  IP: 221.224.33.*
String.IsNullOrEmpty是靜態的,==就不是了?真搞笑。

lz的測試至少有2個問題:
用web測試誤差太大,用控制檯幾句代碼就可以爲什麼不用?
即使測試也要用if(a!=null && a.Length==0)來測,不等價的東西測了能說明什麼?
 

 

#   PigLikeFly 發表於2007-04-30 09:14:27  IP: 124.42.30.*
呵呵, 看完博主的幾個文章後, 被迫回憶那個經典的笑話:

高層掉下個木板, 砸死5個人, 有4個都是CSDN專家, 剩下那個是CSDN的編輯


CSDN裏, 好東西越來越少了

 

#   yanzimywife_2005 發表於2007-04-30 10:32:41  IP: 122.48.126.*
現在的程序員真的是浮躁,LZ不過是共享一點自己的認識 有必要這麼冷嘲熱諷嗎???
也些東西不是沒有用而是在你的領域這個東西不需要關注,所以在你看來是沒有用的,但你能保證以後這個東西對你來說都沒有用嗎??
這個東西當作一個知識儲備,難道不行不?

 

#   Ar7_Top 發表於2007-04-30 11:00:54  IP: 210.13.115.*
>># 未名 發表於2007-04-28 22:25:38 IP: 219.137.160.*
>>將10個小字符串累加起來形成一條長字符串,如果你用了9個“+”號的話,那你的程序能賣出去纔怪。
>>那要怎麼樣纔好啊

用九個+號的話會造成產生9個臨時的字符串對象,需要分配10次內存空間,垃圾回收器要回收9次。

當然先分配一段緩存,再把10個字符串複製過去啦,簡單講就是用StringBuilder或String.Join來並接

這些算是基礎的知識了。
============================================
貌似雄臺基礎知識也不太行
如果是10個字符串相加的話,只要數量已知,性能就是很高的,並不會比StringBuilder差,甚至會因爲分配小區內存和靜態優化性能更好。使用StringBuilder的話適合不定量的字符串相加,或者是分多次累加。至於你說的垃圾收集的問題,StringBuilder並不會比String直接相加更加有優勢,StringBuilder也是複製字符串裏面的內容,它也不是鏈表

 

#   crazy7 發表於2007-04-30 13:25:02  IP: 123.52.10.*
怎麼到處都是這種氣氛,不是冷嘲熱諷就是胡說八道,甚至破口大罵。連樓主發個帖子都遭此待遇,身爲大菜鳥以後真的是不敢再說話了。

大家不能心平氣和的說說嗎?對說對的理由,錯說錯的道理,罵有何用?

 

#   dossystem 發表於2007-05-07 22:03:34  IP: 124.240.98.*
我覺得樓主寫得不錯.
關鍵是看你怎樣去學.
 

 

#   lcyhjx 發表於2007-05-15 15:43:39  IP: 58.49.253.*
頂一個!!
這只是一個學習的示例!!
大家在這裏就是交流的!!
可以發表不同的觀點,但沒必要帶着情緒學習!

 

#   wg2809 發表於2007-05-17 09:39:22  IP: 219.149.220.*
非常感謝LZ!

 

#   bearhunter 發表於2007-05-19 18:58:23  IP: 125.115.13.*
感謝

 

#   maddemon 發表於2007-05-23 23:45:36  IP: 121.233.22.*
學習了!小弟剛剛學習ASP.NET
我判斷是否爲空的時候都是 If(str==null || str="") ...
看來我是最弱的。好像String.IsNullOrEmpty比較好


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章