【问题标题】:C# Real Time Try CatchC# 实时尝试 Catch
【发布时间】:2010-11-23 18:53:53
【问题描述】:

我希望得到真正使用 C# 进行实时编程或真正了解语言内部原理的人的回复。

我知道异常不应用于处理正常处理,而应仅用于检测错误情况。关于这个话题有很多讨论。

我想知道是否有任何运行时间减慢只是因为有一个 try/catch 块(除非程序无论如何都必须结束,否则它永远不会捕获异常)。 try/catch 块位于必须重复调用的函数内。我怀疑只有最低的成本。

可以根据 CPU 周期或其他任务(与浮点乘法相同的成本)或其他方式来量化成本吗?

我们在 windows XP 下使用 Microsoft C#.Net 3.5。

【问题讨论】:

  • 看看 Jon Skeet 关于异常和性能的资源:@​​987654321@

标签: c# real-time throw try-catch


【解决方案1】:

用指标很好地讨论了 try catch 对性能的影响。

Do try/catch blocks hurt performance when exceptions are not thrown?

【讨论】:

    【解决方案2】:

    .NET 异常具有非常、非常低的开销成本,除非它们被抛出。有一个 try/catch 块对性能的影响非常小。我发现对异常处理几乎没有影响,即使在非常快速、紧密的循环中也是如此。

    但是,.NET 中的异常在抛出时非常昂贵。如果你抛出它们而不是许多其他语言,它们往往会对性能产生很大的影响。这是由于在创建异常等时收集了完整的堆栈信息。

    这与一些其他语言的行为相反,例如 python,其中异常处理具有更高的成本,但抛出实际上是相当高效的。

    但是,如果您担心,我建议您对您的日常活动进行概要分析,然后自己进行测试。这是我经过相当多的性能分析后的经验。在您自己的代码库中进行测量是无可替代的。

    【讨论】:

    • 实际上,除非您访问 StackTrace 属性,或者如果异常通过进程边界(即远程处理/wcf/等),否则不会发生堆栈跟踪。创建异常的成本也非常低,因为构造只设置了几个属性。抛出过程设置 StackCrawlMarks 会产生适中的成本,当请求 StackTrace 时,它​​会促进堆栈爬行……但在 .NET 2.0 中,除非您实际访问它,否则不会在每次抛出时都发生跟踪。
    • 是的 - 我实际上指的是堆栈标记机制,但我的答案并不清楚。但是,在我的分析中,这确实会产生相当大的开销(不过,这是假设性能很关键的系统)。 Rico Mariani 有一篇很好的博客文章解释了原因,但对我来说,问题是额外的缓存未命中和页面错误:blogs.msdn.com/ricom/archive/2006/09/25/771142.aspx
    • 感谢您提供的信息。不幸的是,我们没有工具来分析我们的代码......我们只需要遵循最佳实践。
    • 如果您正在编写实时软件,则需要获取 PROFILER。绝对不能替代测量。您可以按照所有规则编写代码,而您认为性能好的事情将成为瓶颈——它一直在发生。有许多可用于 .NET 的分析器,包括一些合理的免费分析工具。
    猜你喜欢
    • 2013-11-10
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 2013-06-19
    • 1970-01-01
    相关资源
    最近更新 更多