【发布时间】:2015-12-02 06:02:36
【问题描述】:
我有这段代码(整个代码并不重要,但可以在this link上看到):
internal static class PlayCardActionValidator
{
public static bool CanPlayCard(...)
{
// ...
var hasBigger =
playerCards.Any(
c => c.Suit == otherPlayerCard.Suit
&& c.GetValue() > otherPlayerCard.GetValue());
// ...
}
}
例如在反编译器 (ILSpy) 中打开代码后,我注意到 C# 编译器新创建的类 <>c__DisplayClass0_0 的存在:
如果这段代码对系统性能不重要,这对我来说不是问题。这种方法被调用了数百万次,垃圾收集器正在清理这些<>c__DisplayClass0_0 实例,这会降低性能:
在使用Any 方法时如何避免创建此类(他的实例及其垃圾收集)?
为什么 C# 编译器会创建这个类,我可以使用 Any() 的替代品吗?
【问题讨论】:
-
这里需要重写你的代码来为捕获的变量otherPlayerCard和trumpCard找到一个安全的家。将它们从局部变量转换为字段,以便它们的值可以保留在方法体之外。 DisplayClass 就是那个安全的家。
-
不要在热路径上使用 LINQ,这是 Roslyn 代码库的政策。
-
我通常会避免推荐微优化,但如果此代码运行 数百万 次,则重构此代码以优化速度将是这里的解决方案。 LINQ 很慢。
-
@DaveShaw 参考?
-
@DanielA.White - github.com/dotnet/roslyn/wiki/Contributing-Code - 请参阅编码约定。
标签: c# performance linq instance any