2010-10-15 119 views
1

我不確定在這裏問這種問題是否可以,但我只想知道兩個代碼片段之間的區別。執行速度更快還是更優化? C#

正如我在這裏SO瀏覽的問題,我發現這個職位: How to find the number of HTML elements with a name that starts with a certain string in c#?

用戶回答了這個:

var dictionary = Request.Form.Keys 
    .Cast<string>() 
    .Where(x => x.StartsWith("abc")) 
    .ToDictionary(x => x, x => Request.Form[x]); 

返回一個包含所有表單元素的鍵/值的字典,從「abc」開始。

更新:可憐的OP正在使用.Net 2.0。所以這裏是老學校的答案:

Dictionary<string, string> keys = new Dictionary<string, string>(); 
foreach (string key in request.Form.Keys) 
{ 
    if (key.StartsWith("abc")) 
     keys[key] = request.Form[key]; 
} 

哪兩個執行速度更快或更優化?我們是不是應該使用舊的?

回答

6

這是「過度優化」的一個很好的例子。該代碼不在內部循環中執行,如果您對其進行配置,則會看到它遠低於應用程序執行時間的0.1%。

因此,在這種情況下,易讀性,可靠性和可維護性是更大的擔憂。鑑於這兩個片段都能可靠地完成這項工作,當你忘記了代碼的工作原理時,你應該在9個月後閱讀哪一個?

+1

有趣的是OP寫'的foreach鍵[當然在計算是如此簡單,你永遠都不想並行,但一般這種情況下,當循環包含更復雜的代碼,你可能。中]在key'中,而在他的LINQ中使用糟糕的'x => x'。如果變量命名正確,我會選擇LINQ以簡化操作。 – 2010-10-15 05:03:11

0

就大O而言,它是等價的。無論哪種方式,它都是一種高效的單程算法。 LINQ版本可能會有一些小的開銷,但它幾乎是一樣的,你應該根據可讀性來選擇。

0

同樣的事情,只是新奇。但它將以相同的方式有效執行。

1

性能差異可以忽略不計,不值得擔心。從一個.NET版本到另一個版本,它也可能有所不同。

第一種方法更可取的原因是您正在聲明您想要的是什麼,而不是如何計算它。一旦你習慣了這種編程風格,你可能會更喜歡它。

以這種方式聲明可以使以後更容易並行(並且可能更易於編譯器進行優化)。

請參閱http://www.albahari.com/threading/part5.aspx瞭解關於聲明性編程的更多討論以及它如何簡化並行化。

+0

我還會加入一個[Eric Lippert的博客]的鏈接(http://blogs.msdn.com/b/ericlippert/archive/2010/01/11/continuing-to-an-outer-loop.aspx)。它在解決「指明什麼,而不是如何」的觀點方面做得很好。 – R0MANARMY 2010-10-15 04:25:09