繁体   English   中英

捕获的错误太多导致性能不佳?

[英]bad performance from too many caught errors?

我在 C# (.NET 2.0) 中有一个大型项目,其中包含由 SubSonic 生成的大量代码。 像这样的 try-catch 会导致可怕的性能下降吗?

    for (int x = 0; x < identifiers.Count; x++)
            {decimal target = 0;
                try
                {
                    target = Convert.ToDecimal(assets[x + identifiers.Count * 2]); // target %
                }
                catch { targetEmpty = true;  }}

发生的情况是,如果传入的给定字段不能转换为小数,它会设置一个标志,然后在记录中进一步使用该标志来确定其他内容。

问题是,当我解析 30k 条记录时,应用程序实际上抛出了成千上万个异常。 整个过程几乎需要 10 分钟才能完成所有事情,我的总体任务是改善这段时间,如果这是一个糟糕的设计理念,这似乎很容易挂果。

任何想法都会有所帮助(善待,这是悲惨的一天)

谢谢,克里斯

对控制流使用异常通常是一种不好的做法(正是因为您观察到的效率低下)。 您需要将什么类型的数据转换为decimal 如果输入不是预期的格式,您可以使用TryParse方法或其他一些不会引发异常的方法吗?

如果您在解析字符串时Decimal.TryParse方法应该可以解决问题,因为它通过返回false报告失败:

decimal d;
if (Decimal.TryParse(str, out d)) 
  // Ok, use decimal 'd'
else 
  // Failed - do something else

那是一段非常可怕的代码。 一般来说,异常应该只用于捕获意外的结果。 您收到大量异常的事实意味着这是一个应该成为内在逻辑一部分的常见情况。

decimal.TryParse在这里是一个更好的选择,我建议也缓存identifiers.Count * 2的值(不确定编译器是否会优化它)

还有一个用于十进制的TryParse 它避免了异常并使用 bool 来表示成功/失败。

看起来很可怕的代码,你会得到关于如何修复它的好建议。

如果您想知道这些异常是否花费了您很大一部分时间,有一种简单的方法可以找出答案。

只需暂停大约 10 次,每次检查调用堆栈。 如果异常花费了一定百分比的时间,例如 50%,那么您将在大约 50% 的暂停时间抛出或捕获它们的过程中看到它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM