2010-12-14 12 views
1

だから、〜4層の深さのカスタムタイプ階層を持つC#アプリケーションがあります。C#のDSL /カスタムタイプのツールキット?

このレイヤーは、データの検証と変更イベントの伝達を完全に実装するために存在します。

例は、 DocumentNameValue -> NameValue - > StringValue -> BaseDataValueです。

システムは正常に動作しますが、間接的なすべてのレイヤー、パフォーマンスサーファーが与えられています。絶対的に言えば、それは大ヒットではありませんが、それは追加します。

パフォーマンスの問題は、データアクセスで発生するネストされた呼び出しの結果であると考えられます。

たとえば、DocumentNameValue.setValue("test.doc")を呼び出すと、入力の特定の検証テストを実行する各階層の階層が作成されます。これらはベースで始まり、上に移動します。様々なイベントも途中で解雇されます。値が実際に階層の基底に「格納されている」場合は、意味があります。

私は本当にやったすべては種類の厳密な階層を定義しているので、のいずれかを実行するための推奨方法は存在しない:

  1. は「フラット」の高性能と同等にして、このC#のコードを変換しますか? (実行時またはコンパイル時)
  2. おそらく、型/オブジェクトの等価なリストを吐き出すだけのDSLを構築するのは良いでしょうか?

全体的な目標は2つあります。私のアプリケーションの問題のドメインに固有の強力なタイプを用意して、妥当性検査ルールを入れるためのきれいな場所を用意します。

誰でもヒント/提案を提供できますか?私はこれをすべて間違っているのですか?

+0

あなたは、階層がパフォーマンス上の問題と関係していると思われる理由、またはパフォーマンス上の問題が発生していることさえあります。 –

答えて

3

私の最初の本能は、あなたが、これはあなたのパフォーマンスヒットの理由を知っているか疑問です、ありがとうございました。プロファイラを実行しましたか?

私の2番目の質問は、コードサンプルを要求することです。このレイヤリングはOOP(継承)を介して反映されていますか?

さまざまなタイプを使用して異なる懸念事項を表現していることがわかっています。これは良いことです。あなたはViewModel/Model/DataModelのようなものを作りました。これはかなり標準的です。


あなたのコメントがあれば、ANTS Performance Profilerの試用版をダウンロードし、それを使って低速実装をプロファイルすることをお勧めします。どのメソッドが最長で使用されているかを正確に伝え、変更の結果を数値化することができます。

アプリケーションが非常にシンプルでない限り、レイヤ化されたアプローチをまだ破棄することはお勧めしません。階層化されたシステムをきれいに実装する方法を学ぶことで、後であなたの正気を払うことができます。

+0

はい、スピードの違いは目立つ単純なフラットな実装です。 – nonot1

+0

@notot1:実をつかみましょう。メソッド呼び出しと5つ(または10つ、または深く入れ子になっている多くのレイヤー)の違いに気付いているだけです。タイトなループでも何百万回もの繰り返しはありません。マイクロ秒で話しています。 –

+0

@qstarin確かに、私は自分のテストを再検討します。多分私は間違いをした。 – nonot1

1

システムが正常に動作しますが、間接のすべて 層を与え、 サーファーをパフォーマンス。絶対的に言えば、それは の大ヒットではありませんが、それは加算されます。

おそらくそうではありません。おそらくこの仮定を再検討する必要があります。

このようなことはよく行われますか?

いいえ、必要ありません。継承階層(別のクラスを継承しないクラス)を作成しても、広大で広大で圧倒的な大多数のアプリケーションのパフォーマンスには意味を持ちません。さらに、あなたのプロジェクトがであり、相続の影響を受けてである場合は、おそらく管理下の言語で間違った決定を下している可能性があります。

+0

私の更新された質問をご覧ください...私はそれがいくつかを明確にすると思います。 – nonot1

0

明確にするために、パフォーマンスの問題はデータアクセスで発生するネストされた呼び出しの結果と考えられます。

たとえば、DocumentNameValue.setValue( "test.doc")を呼び出すと、入力の特定の検証テストを実行する各階層の階層が作成されます。

あなたはデータアクセスの最大限の制御を失ってしまっています。タイプがフラット化されているかどうかにかかわらず、SQLで発行されたものやIOがデータベースで費やしたものは変更されません。

データアクセスを抽象化から外すか、すべてのセッターで予想外のIOコストを被ります。レイジーを得る。

関連する問題