我刚刚发布了一篇关于使用lambda表达式时性能提升的JetBrains文章:Unusual Ways of Boosting Up App Performance. Lambdas and LINQs。
我想知道使用实例变量会导致同样的性能下降吗? 在文章中,有人告诉我,使用对lambda表达式中相同方法范围内的变量的重新引用的下一种代码会降低性能:
public void DoSomething(IEnumerable<Something> myIEnumerable){
DateTime yesterDay = DateTime.Now.AddDays(-1);
return myIEnumerable.Where(obj => obj.Expired>yesterDay);
}
但是如果我访问实例变量怎么办?它会产生同样的负面影响吗?:
class SomeClass{
private DateTime _yesterDay;
public void Foo(IEnumerable<SomeThing> myIEnumerable){
_yesterDay = DateTime.Now.AddDays(-1);
IEnumerable<SomeThing> someThings = DoSomeThing(myIEnumerable);
//...
}
public IEnumerable<Something> DoSomething(IEnumerable<Something> myIEnumerable){
return myIEnumerable.Where(obj => obj.Expired>_yesterDay);
}
}
由于
答案 0 :(得分:0)
在jetBrains的文章中,他们是正确的,因为在每次调用时实现委托可能会花费成本,并且仅在上下文不是常量时才需要。
需要Closure来捕获实例(或局部变量),并且不能本机缓存。如果只使用委托参数,常量和静态成员,则不需要闭包。
另一方面,成本只会影响大量调用的代码(热路径),如大批量或基础代码(架构师关注)。
在大多数情况下,采用这种开销来改变设计似乎是一种过早的优化,而这种优化对维护来说确实是成本。