是否有可能有太多的匿名代表?

时间:2009-06-29 15:53:29

标签: c# .net performance logging

最近,我已经采用了在我的部分代码中进行大量诊断日志记录的模式,它使用了lambda表达式/匿名委托,如下所示:

MyEventManager.LogVerbose( LogCategory.SomeCategory, () => String.Format(msg_string, GetParam1(), GetParam2(), GetParam3() );

请注意,LogVerbose的第二个参数是一个lambda表达式,其值为字符串。这样做的原因是,如果实际上未启用详细日志记录,则LogVerbose应尽可能少地完成工作,以便最大限度地降低性能影响。在某些情况下,错误消息字符串的构造可能需要时间或资源,如果从不评估lambda表达式,则不会产生性能损失。

我想知道如果像这样的许多匿名代表乱丢类型系统会对应用程序性能产生一些不可预见的后果,或者我是否应该考虑其他任何策略。

3 个答案:

答案 0 :(得分:2)

虽然我实际上并不确切地知道这个问题的答案,但我认为值得考虑的是,如果有任何暗示会出现某种情况,那么在C#中使用更具功能性的编程风格会受到严重破坏。限制使用此类表达。

答案 1 :(得分:2)

应该没问题。特别是,如果您的匿名函数没有捕获任何内容,它将被缓存为静态字段(因为它可以)。如果您捕获“this”,那么您最终将创建新的委托实例,但它们并不昂贵。

如果您捕获局部变量,那将涉及实例化嵌套类型 - 但是如果您看到它实际上成为一个问题,我只会担心这一点。与优化一样,首先关注可读性,测量性能,然后对其进行分析,找出需要集中精力的地方。

答案 2 :(得分:2)

我有一个解决方案,有成千上万的代表,它仍然有效。有时Visual Studio有点笨拙,但是否因为我们有数百个项目或者这个或其他因素是未知的。应用程序的性能似乎没有受到太大影响(通过相当多的性能测试)。