哪个更快执行或更优化? C#

时间:2010-10-15 04:05:49

标签: c# linq

我不确定这里是否可以提出这类问题,但我只是想知道两个代码片段之间的区别。

当我在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];
}

两者中的哪一个执行速度更快或更优化?我们应该永远不要使用旧的吗?

4 个答案:

答案 0 :(得分:6)

这是“过度优化”的一个很好的例子。代码不是在内部循环中执行的,如果你对它进行分析,你会发现它远远低于应用程序执行时间的0.1%。

因此,在这种情况下,易读性,可靠性和可维护性是一个更大的问题。鉴于这两个片段都能可靠地完成这项工作,那么当你忘记这段代码是如何运作的时候,你想在9个月后阅读哪一段呢?

答案 1 :(得分:1)

性能差异可以忽略不计,不值得担心。它也可能因.NET的一个版本而异。

第一种方法更可取的原因是你要声明你想要什么,而不是如何计算它。一旦你习惯了这种编程风格,你可能会更喜欢它。

以这种方式声明它使以后更容易并行化(并且编译器可能更容易优化)。

有关声明性编程及其如何简化并行化的更多讨论,请参阅http://www.albahari.com/threading/part5.aspx

[当然在这种情况下计算如此简单,你永远不会想要并行化它,但一般来说,当循环包含更复杂的代码时,你可能会这样做。]

答案 2 :(得分:0)

就Big O而言,它是等价的。无论哪种方式,这都是一种有效的一次通过算法。 LINQ版本可能会有一些轻微的开销,但它几乎相同,您应该根据可读性进行选择。

答案 3 :(得分:0)

同样的事情,只是新奇的。但它会以同样的方式有效地执行。