2010-04-22 46 views
3

我在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记录进行解析时,应用程序逐字地抛出数以万计的异常。整个过程需要将近10分钟的时间,而我的总体任务是提高一些时间,如果这是一个糟糕的设计理念,这似乎很容易挂果。

任何想法,将是有益的(是一种,它是一个悲痛的日子)

感谢, 克里斯

+1

尝试阅读下面的句子,然后将每个'Ouch!'实例替换为一个例外并且推断出你的代码的效果: 是的,''哎呀!'那里'''''可以'''''''''' '''哎呀!''小'''''''''''''''''''''' – 2010-04-22 21:24:38

+0

我最近才开始查看这段代码......实际上,如果3个字段实际上是小数或者它们是空白/空/非小数,它看起来像有3个类似的测试。然后,如果所有3个标志字段都为真,它不会尝试添加记录。呃...是的,这很可悲。 – 2010-04-22 21:38:17

回答

5

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

Decimal.TryParse method应该做的伎俩,如果你解析字符串,因为它通过returnning false报告失败:

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

非常感谢,我用上面的代码替换了那个特殊的可怕代码的3个地方,现在整件事情都以小于30秒完成! – 2010-04-22 22:43:40

3

有对十进制TryParse为好。它避免了这个异常,而是用一个bool来表示成功/失败。

4

这是一个代码真正可怕的看片。一般来说,例外应该只用于捕获意外的结果。事实是你得到很多异常意味着这是一个常见的情况,应该成为内在逻辑的一部分。

decimal.TryParse将在这里是一个更好的选择,我会建议缓存的identifiers.Count * 2价值以及(不知道编译器将优化那个)

0

这是可怕的看代码,你要如何很好的建议要解决这个问题。

如果你想知道这些例外是否花费你很大一部分时间,有一个简单的方法来找出。

只需暂停约10次,每次检查调用堆栈。如果例外花费了一定比例的时间,例如50%,那么您会在投掷或捕捉大致百分之几的暂停过程中看到它。

相关问题