ASP.NETパフォーマンス:LoadControlを使用して使用します
-
29-09-2019 - |
質問
データを表示する方法について決定しようとしています。私が今持っているのは、リピーターに表示される製品のリストです。しかし、コードメンテナンスのために、私は製品アイテムを別々のusercontrolに入れ、LoadControlを使用してDB結果を使用してループにロードします。
製品コントロール自体は非常にシンプルで、タイトル、URL、評価などのパブリックプロパティがいくつかありますが、これが私のパフォーマンスに影響するかどうかはわかりません。私はこことフォーラムでいくつかの読書をしました、そして、特にあなたがこれらのコントロールの20または30以上を持っている場合、それはベストプラクティスではないと言います。
したがって、この方法を使用して実際にパフォーマンスヒットなのでしょうか、それとも1日あたり約10.000ヒットで大丈夫です。他の提案も大歓迎です。
解決
私もこれに興味があったので、私はいくつかのテストをしました、そして、それは通常のクラスのインスタンス化と比較して、LoadControlにかなり大きなパフォーマンスのヒットがあるように思われます。
1つのプロパティと100,000個のロードコントロールのロードを100,000個のインスタンスで100,000個の単純なクラスのインスタンスの作成をテストしました。また、クラスでは16ms対ロードコントロールで1950msでした。オーバーヘッドがたくさんあるようです。ユーザーにもっと構成要素コントロールを追加すると、負荷時間が上がったことに気づきました。 (これは、実際にコントロールをページに追加したり、レンダリングしたりしなかった負荷です)
ユーザーに目立つのに十分なヒットですか?おそらく、LoadControlで大量のインスタンスをロードしていない限りではありません。
他のヒント
各製品に個別のユーザーコントロールを作成することは、おそらく最善の方法ではないと思います。
しかし、あなたはすでに私の提案のためにあなたがいる必要がある場所の部分的にあります。
ユーザーコントロールで既に定義しているすべてのプロパティを使用して、製品のクラスを作成してみませんか。
表示する製品を取得するときは、製品のコレクションを取得し(レコードをループしてコレクションを作成します)(たとえばリスト)、リピーターのデータソースとしてコレクションを使用します。
使用するとき Page.LoadControl
ループ内で、それを独自の関数に分けてください、そしてこれはわかります ASP.Net
コントロールを毎回ディスクからロードする代わりにキャッシュします。
例:(VB)
Private Function LoadMyControl() As myCustomControl1
Return Page.LoadControl("....")
End Function
それで...
For each [....]
Dim myCtrl1 as myCustomControl1 LoadMyControl()
myCtrl1.prop1 = "blah"
myPlaceholder1.Controls.Add(myCtrl1)
Next
関数内でそれをカプセル化することにより、キャッシュエンジンはそれが同じユーザーコントロール(それが)であると考え、ディスクに一度だけアクセスし、大幅に高速化します。