【问题标题】:Any performance issue using static function Objects使用静态函数对象的任何性能问题
【发布时间】:2014-12-20 00:10:43
【问题描述】:

我有一段这样的代码。 我写这个是因为我喜欢扩展方法和 lambda 表达式:

public static class TuneingRules
{
    public static Func<HtmlNode, bool> IsNodeHavingClearNone = (node) =>
    {
        if (node.HasAttributes)
        {
            // HtmlAttribute atr = item.Attributes.Where(at => at.Name == "id" && at.Value == "hello").FirstOrDefault();
            HtmlAttribute atr = node.Attributes.Where(at => at.Name == "style").FirstOrDefault();
            if (atr != null)
            {
                return Regex.Match(atr.Value, "clear\\s*:\\s*none;").Success;
            }
        }
        return true;
    };

}

和这样的扩展方法。

public static class ExtensionMethods
{
      #region Ignoring Rules
      public static bool Ignore(this HtmlNode Node, Func<HtmlNode,bool> func) {
          return func(Node);
      }
      #endregion 
}

现在我有两种方法来使用这段代码..

1 例

if (!htmlNode.Ignore(TuneingRules.IsNodeHavingClearNone)){
   //then do somethings
}
 // here i am open to write lambda expression like this.
if (!htmlNode.Ignore( node =>  node.innerText =="" ){
   //then do somethings
}

2 例

if (!TuneingRules.IsNodeHavingClearNone(htmlNode)) { 
     //then do something                      
}

如果TuneingRules 恐怕会有性能问题 有许多静态 Func&lt;HtmlNode,bool&gt; 对象。我需要重构我的代码吗? 在第一种情况下,有一个额外的调用通过忽略函数...... 但在第二种情况下,我可以直接调用函数对象。 或者是否有另一种方法来编写此代码以坚持使用 lambda 以及扩展方法?

【问题讨论】:

    标签: c# lambda extension-methods


    【解决方案1】:

    不,没有性能问题。

    当您第一次使用TuneingRules 类时,性能会受到一点影响,因为将调用静态构造函数并初始化所有静态变量。然而,与函数所做的实际工作相比,这应该是相当小的。

    同样,与函数所做的工作相比,多做一个方法调用可以忽略不计。扩展方法调用甚至有可能被 JIT 编译器内联,因此执行的代码实际上将执行与第二种情况相同的操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-15
      • 1970-01-01
      • 2013-06-11
      • 1970-01-01
      • 1970-01-01
      • 2015-03-27
      • 2010-10-24
      • 1970-01-01
      相关资源
      最近更新 更多