【问题标题】:How much less efficent would the linq technique be in the following case and could either be optimised?在以下情况下,linq 技术的效率会降低多少,并且可以优化?
【发布时间】:2011-04-24 14:08:14
【问题描述】:

在以下情况下,linq 技术的效率会降低多少,可以优化吗?

Linq 技术

public String FindProviderName(Int32? TrueName)
{
    String providerName = (from p in this.Providers
                           where p.TrueName == TrueName
                           select p.ProviderName).First().ToString();

    return providerName;
}

步行技巧

public String FindProviderName(Int32? TrueName)
{
    String providerName = String.Empty;

    foreach (IProvider provider in this.Providers)
    {
        if (provider.TrueName == TrueName)
        {
            providerName = provider.ProviderName;
            break;
        }
    }

    return providerName;
}

【问题讨论】:

  • 如果ProviderNamestring,则无需调用ToString()
  • 没错,但编译器会知道这一点,而不必费心在 IL 中运行它?
  • @Carnotaurus 它会运行它,但它只是一个“返回这个”的调用,非常快
  • 哦,我以为编译器会很聪明,不会编译出这么多余的语句。所以,我会给他一个赞成票。
  • @Carnotaurus - 编译器还希望程序员足够聪明,不会添加多余的语句:) 实际上它消除了一些而不是全部的愚蠢。

标签: .net linq performance optimization


【解决方案1】:

如果这是 LINQ-to-objects,它们都会非常快。如果您想要更快,请考虑使用Dictionary<int,string> 并使用TryGetValue(...)。显然你需要预先生成字典,也许是通过 ToDictionary()。

请注意,显示的两个示例在不匹配时是不同的;一投;一个返回一个空字符串。此外,无需对字符串调用 ToString()。


是更快的版本(cmets);你需要一个字段,

Dictionary<int,string> lookup;

并且在使用之前(或数据更改之后)的某个时间点,您需要填充它:

lookup = providers.Where(p => p.RealName != null)
    .ToDictionary(p => p.RealName.Value,
        p => p.ProviderName);

那么您的查找将是:

string providerName;
if(realName == null ||
    !lookup.TryGetValue(realName.Value, out providerName))
    return null;
return providerName;

【讨论】:

  • 是的,这两种技术做的事情并不完全相同 - 你能给我一个更快实现的例子吗?
【解决方案2】:

你有代码,如果你想知道它的效率如何,只需测量它。

当然,人们经常担心代码的效率,而实际上他们不应该担心。可读性不是更重要吗?这是让你慢下来的代码吗?

话虽如此,第一个代码可以像这样稍微快一点:

public String FindProviderName(Int32? TrueName)
{
    String providerName = this.Providers
                              .First(p => p.TrueName == TrueName)
                              .Select p.ProviderName);

    return providerName;
}

使用for 而不是foreach 可以使第二个更快(如果您的集合类型是List&lt;T&gt; 或数组。

不过,这两种优化很可能不会产生任何可衡量的效果。

【讨论】:

  • 是的,我想将 linq 重写为更基本的 lamdba 会稍微提高速度...是的,this.Providers 与 IList
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-02
相关资源
最近更新 更多