来自太多捕获错误的糟糕表现?

我在C#(.NET 2.0)中有一个大项目,它包含由SubSonic生成的非常大的代码块。 像这样的尝试捕获导致可怕的性能打击?

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记录进行解析时,应用程序实际上会抛出数以万计的exception。 整个过程花了将近10分钟的时间来完成所有事情,我的总体任务是改善一些时间,如果这是一个糟糕的设计理念,这似乎很容易挂掉水果。

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

谢谢,克里斯

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

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

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

这是一段真正可怕的代码。 通常,exception仅应用于捕获意外结果。 您获得大量exception的事实意味着这是一个应该成为内在逻辑的一部分的常见条件。

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

还有一个TryParse for Decimal。 它避免了exception并使用bool来表示成功/失败。

这是一个可怕的代码,你得到了如何解决它的好建议。

如果你想知道这些例外是否花费了你很大一部分时间,那么有一个简单的方法可以找到答案。

只需暂停10次,每次都检查一下调用堆栈。 如果exception花费了一定比例的时间,例如50%,那么你将在大约停顿百分比的投掷或捕获过程中看到它。