2010-04-22 68 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%,那麼您會在投擲或捕捉大致百分之幾的暫停過程中看到它。

相關問題