2010-12-14 52 views
1

所以,我有一個C#應用程序,它具有大約4層深的自定義類型層次結構。C#中DSL /自定義類型的工具包?

此分層的存在是爲了提供數據驗證和更改事件傳播的乾淨實施。

一個例子是: DocumentNameValue -> NameValue - > StringValue -> BaseDataValue

該系統工作正常,但給予所有層間接性,性能衝浪者。絕對而言,這不是一個巨大的打擊,但它確實加起來。

爲了澄清,性能問題似乎是數據訪問發生嵌套調用的結果。

例如,調用DocumentNameValue.setValue("test.doc")將導致層次結構的每一層都在輸入上運行特定的驗證測試。這些從基地開始並向上移動。一路上也發生了各種各樣的事件。該值實際上是「存儲」在層次結構的基礎上的,如果這有意義的話。

因爲所有我真的做的是確定一個類型的嚴格的等級制度,確實存在一個推薦的方法做任何的:

  1. 變換在此C#代碼爲「平」高性能等同? (運行時或編譯時)
  2. 或者,或許更好,構建一個DSL只會吐出類型/對象的等效列表?

總體目標是雙重的:具有特定於我的應用程序問題域的強類型,提供一個乾淨的地方來放置我的驗證規則。

任何人都可以提供一些提示/建議嗎?我做這一切都錯了嗎?

謝謝

+0

您仍然沒有給我們任何理由認爲層次結構與性能問題有關,甚至根本不存在性能問題。 – 2010-12-15 00:37:36

回答

3

我的第一本能是問你怎麼知道這是你的性能損失的原因。你有跑分析器嗎?

我的第二個問題是要求一個代碼示例。這個分層是通過OOP(繼承)反映的嗎?

根據我的理解,您使用不同的類型來表示不同的問題 - 這很好。你已經構建了像ViewModel/Model/DataModel這樣的標準。


考慮您的意見,我建議你下載螞蟻性能分析器的審判,並用它來分析執行緩慢;它會精確地告訴你哪些方法花費的時間最長,並且可以讓你量化變化的結果。

我不會建議撕裂你的分層方法,除非應用程序非常簡單。學習如何清潔地實施分層系統可以在以後得到滿足。

+0

是的,速度差異與一個簡單的平面實現顯而易見。 – nonot1 2010-12-15 00:35:11

+0

@ nonot1:讓我們變得真實。只有*無法*你注意到一個方法調用和五個(或者十個,或者你嵌套的很多層)之間的區別。即使在一百萬次迭代的緊密循環中也沒有。我們正在談論微秒。 – 2010-12-15 15:56:44

+0

@qstarin事實上,我會重新審視我的測試。也許我犯了一個錯誤。 – nonot1 2010-12-16 01:53:51

1

該系統工作正常,但給定所有 間接層,性能 衝浪者。絕對而言,這不是一個巨大的命中,但它確實加起來。

可能不是。你很可能需要重新審視這個假設。

這種事情經常發生嗎?

不,因爲沒有必要。創建繼承層次結構(與不繼承其他類的繼承層次結構)並不會對廣大龐大而龐大的絕大多數應用程序的性能產生有意義的影響。此外,如果您的項目是受使用繼承影響嚴重的項目,那麼您可能已經使用託管語言做出了錯誤的決定。

+0

請參閱我更新的問題...我認爲它會澄清一些事情。 – nonot1 2010-12-15 00:35:54

0

爲了澄清,性能問題似乎是由於數據訪問發生嵌套調用的結果。例如,調用DocumentNameValue.setValue(「test.doc」)將導致每個層次的層次都對輸入運行特定的驗證測試。

您已經抽象到最大,因此失去了對數據訪問的控制權。無論類型是否平坦,都不會改變sql發佈或IO在數據庫中的花費。

將數據訪問移出抽象,或在每個設置器上承受意想不到的IO成本。懶惰。