2011-01-09 64 views
1

如果有的話,它們之間的性能差異是什麼?C# - 數組索引與LINQ?

/// option 1 
string result = data.Split('.').Last<string>(); 


/// option 2 
string[] parts = data.Split('.'); 
string result = data[data.Length-1]; 

/// option 3 
string result = data.Substring(data.LastIndexOf('.')+1); 

假設data處於part1.part2.part3格式的字符串。

編輯

這真是比什麼都無聊的好奇。我還沒有打開反射器來查看LINQ內部發生了什麼,但我沒有看到它比直接數組操作更快。感謝您的提示。

+0

您在選項3中缺少某些內容(data.Substring?) – 2011-01-09 22:28:34

+0

哎呀!糾正。 – 2011-01-09 22:30:10

回答

2
void Main() 
{ 
    var tester = new testing(); 
    var runTimeOne = tester.optionOne(); 
    runTimeOne.Dump(); 
    var runTimeTwo = tester.optionTwo(); 
    runTimeTwo.Dump(); 
    var runTimeThree = tester.optionThree(); 
    runTimeThree.Dump(); 
} 
public class testing 
{ 
    public String dataString = "part1.part2.part3"; 
    public int numRuns = 1000000; 

    public TimeSpan optionOne() 
    { 
     var startTime = DateTime.Now; 

     for(var i = 0; i < numRuns; i++) 
     { 
      string result = dataString.Split('.').Last<string>(); 
     } 
     return (DateTime.Now - startTime); 
    } 

    public TimeSpan optionTwo() 
    { 
     var startTime = DateTime.Now; 

     for(var i = 0; i < numRuns; i++) 
     { 
      string[] parts = dataString.Split('.'); 
      string result = parts[parts.Length-1]; 

     } 
     return (DateTime.Now - startTime); 
    } 
    public TimeSpan optionThree() 
    { 
     var startTime = DateTime.Now; 

     for(var i = 0; i < numRuns; i++) 
     { 
      string result = dataString.Substring(dataString.LastIndexOf('.')+1); 
     } 
     return (DateTime.Now - startTime); 
    } 
} 

結果:

00:00:00.9660552

00:00:00.2010115

00:00:00.0360021

4

如果你確實在意,那麼測量它。

我猜想選項3)比其他2快一點。
但這只是一個猜測。

2

選項1和2在性能方面相同,因爲Last擴展方法檢查潛在的可擴展標記是否具有索引器,如果它確實返回最後一個元素。就選項3而言,您需要與其他兩項進行衡量,但我懷疑會有微不足道的差異。

+0

你的推理不支持你的結論。如果選項1做了一些工作(檢查是否存在索引器),然後做了選項2,那麼最有可能的選項1比選項2慢。 – 2011-01-09 22:35:03

1

對於小弦的差異會很小,但對於大字符串,第三種選擇顯然更有效。

前兩個選項將掃描整個字符串並將其複製到新字符串中並創建一個字符串數組。第三個選項將從結尾掃描字符串以查找句點,並只創建一個需要的字符串。

因此,對於特定用途,您將測量哪種方法對於您具有的特定數據是最有效的,但對於一般用途而言,第三種選擇是最好的,因爲它的擴展性更好。