2016-03-13 64 views
0

有什麼不同,在性能方面,下面的C#代碼之間:string.length減> 0和string.length減= 0

string s = "abc"; 
bool notEmpty1 = s.Length != 0; 
bool notEmpty2 = s.Length > 0 

如果沒有,這是一個更好的編碼指南?在這個例子中,我還有興趣看看是否有其他語言的行爲不同於c#。

+1

'字符串自己運行它。 IsNullOrEmpty(s)' – Rob

+0

@Rob我考慮過這個,但是如果我知道's'永遠不會爲空,我真的需要這個嗎? –

+0

你也可以這樣檢查:'bool notEmpty =!s.Equals(String.Empty)' – g4s8

回答

4

所以,我決定測試一下,結果有些不確定,但很明顯,任何性能差異都很小。

這裏是我寫來測試它的代碼:

var times = 100000; 
    string s = "abc"; 
    Stopwatch sw = new Stopwatch(); 
    sw.Start(); 
    for (var i = 0; i < times; i++) 
    { 
     bool notEmpty1 = s.Length != 0; 
    } 
    var diff = sw.Elapsed; 
    sw.Restart(); 
    for (var i = 0; i < times; i++) 
    { 
     bool notEmpty2 = s.Length > 0; 
    } 
    var gt = sw.Elapsed; 
    sw.Restart(); 
    for (var i = 0; i < times; i++) 
    { 
     bool notEmpty3 = !string.IsNullOrEmpty(s); 
    } 
    var noe = sw.Elapsed; 
    sw.Restart(); 
    for (var i = 0; i < times; i++) 
    { 
     bool notEmpty4 = s.Any(); 
    } 
    var any = sw.Elapsed; 
    sw.Restart(); 
    for (var i = 0; i < times; i++) 
    { 
     bool notEmpty4 = s != string.Empty; 
    } 
    var dif2 = sw.Elapsed; 
    Console.WriteLine(string.Format("!= {0}\n> {1}\nIsNullOrEmpty {2}\nAny {3}\n!= empty {4}", diff.TotalMilliseconds, gt.TotalMilliseconds, noe.TotalMilliseconds, any.TotalMilliseconds, dif2.TotalMilliseconds)); 

這裏有一些測試結果:

!= 0.4986 
> 0.451 
IsNullOrEmpty 0.3965 
Any 6.8151 
!= empty 0.5844 

!= 0.7649 
> 0.7822 
IsNullOrEmpty 0.5672 
Any 3.4259 
!= empty 0.5104 

!= 0.7984 
> 0.5202 
IsNullOrEmpty 0.3484 
Any 3.3951 
!= empty 0.4786 

!= 0.9502 
> 0.6104 
IsNullOrEmpty 0.4877 
Any 4.1838 
!= empty 0.6849 

可以在this fiddle.

+2

在小提琴手中運行microbenchmark,你認真嗎?以下是1M週期的一些實際結果:!= 0.2939; > 0,2936; IsNullOrEmpty 0,587;任何18,0589; !=空2,3353 –

+0

其實,我寫了一個新的控制檯應用程序並進行了測試。我只做了小提琴讓OP有機會將它複製到他自己的環境中,並直接運行而不需要添加任何東西。 –

+0

但在我看來,您提供了來自小提琴手的結果,而不是從控制檯應用程序。 –

4

改爲使用string.IsNullOrEmpty(s)string.IsNullOrWhiteSpace(s)

-1

更好的選擇,更優雅是

bool notEmpty2 = s.Length > 0 

這是因爲它是不可能有比0長度小於字符串

+1

這裏的邏輯避開了我。 –

+1

如果不可能小於0,是不是更喜歡'!= 0'?否則,支票在邏輯上會更昂貴。 – Rob

0

您可以使用此一:

string.IsNullOrEmpty(string) 

string.IsNullOrWhiteSpace(string) 

,但你可以這樣做:

s.Length > 0 
0

+1的String.Empty

而且,你爲什麼檢查陰性(cb.net當量)?

Bool isEmpty = string.IsNullOrEmpty(s); 
+1

「.. for string.empty」?這是什麼意思? – leppie

+0

我試圖說我給了一個+1投票給那個說要真正看到這個字符串是否爲空的人。在範你可以做string.empty(變量),而不是手動檢查其長度 – BlueDan

相關問題