ASP.NET性能:在for-each中使用LoadControl

时间:2010-10-12 18:41:48

标签: asp.net performance loadcontrol

我正在尝试决定如何显示我的数据。我现在拥有的是转发器中显示的产品列表。但是对于代码维护,我将我的产品项目放在一个单独的用户控件中,然后使用LoadControl将它们加载到带有db结果的循环中。

产品控制本身非常简单,只有一些公共属性,如标题,网址,评级,但我不确定这是否会影响我的表现。我在这里和论坛上做了一些阅读,有些人说这不是最好的做法,特别是如果你有超过20或30个这些控件。

所以,使用这种方法是否真的会受到性能影响,或者每天点击大约10.000次就能保持良好状态。我们也欢迎任何其他建议。

3 个答案:

答案 0 :(得分:2)

我做了一些测试,因为我对此也很感兴趣,而且与实例化普通类相比,似乎在LoadControl上有相当大的性能影响。

我测试了创建100,000个简单类的实例,其中一个属性与100,000个loadcontrol实例加载一个新的空白控件。对于类和负载控制的1950ms,它是16ms。似乎有很多开销。我注意到如果我向用户控件添加了更多组成控件,则加载时间会增加。 (这只是我没有实际将控件添加到页面或渲染它们的负载)

用户注意到它是否足够明显?除非您使用loadcontrol加载大量实例,否则可能不会。

答案 1 :(得分:0)

我认为为每个产品制作单独的用户控件可能不是最好的方法。

但是,你已经部分地需要我的建议了。

为什么不为您的产品创建一个类,其中包含您已在用户控件上定义的所有属性。

检索正在显示的产品时,检索产品集合(循环记录并创建集合)(例如List),并将该集合用作Repeater的DataSource。

答案 2 :(得分:0)

当你在循环中使用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

通过将其封装在函数调用中,缓存引擎认为它是相同的用户控件(它是),并且只会访问磁盘一次,从而大大加快了它的速度。