我的任务是帮助提高asp.net(4.5)webforms应用程序的性能,不幸的是使用了updatepanels。 They are really evil.但摆脱它们并不是那么简单,因为系统与大量事物紧密相关。我已经能够摆脱一些不必要的更新面板。
无论如何,这是一个CRM类型系统,所以想象一下你去一个客户的详细信息页面。在客户的详细信息页面中,您可以获得一些常规客户信息。页面底部有标签。例如,客户详细信息页面可以包含"联系人"这对客户有用,"产品"客户销售,"评级"为客户..等等。这些选项卡中的每一个基本上都是div,并且它周围是一个更新面板。最初只加载第一个选项卡。当您单击选项卡时,将进行异步调用,该调用将使用数据加载选项卡。所以基本上你有一个看起来像这样的页面:伪代码:
updatepanel for entire page
html
<!-- tabs -->
updatepanel for contacts sub panel
contacts html
/updatepanel
updatepanel for products sub panel
products html
/update panel
updatepanel for ratings sub panel
ratings html
/update panel
/updatepanel end the entire page
提到的标签是div,基本上是jquery标签。起初我注意到页面上的每个更新面板都将updatemode
设置为always
。当我需要更新面板进行更新时,我立即将updatemode
更改为conditional
并明确调用了Update()
。一个很小的改进。然后我注意到初始更新面板(用于整个页面的面板)将其ChildrenAsTrigger
属性设置为true ...所以我将其更改为false。非常小的改进。
然后我再次开始测试页面,看看性能如何...仍然很糟糕。实际上,当页面首次加载并且第一个选项卡加载页面时非常快。当我单击另一个选项卡时(它通过异步进程加载子面板数据,通过调用隐藏按钮服务器端事件来加载数据)。所以这绝对不是真正的ajax,但嘿,它是我们拥有的。所以基本上服务器端事件只是将一些数据绑定到该选项卡上的网格。获取数据的表现绝对没问题 - 这不是我的问题。
现在我的问题是当我向上和向下滚动页面时,性能开始下降。一旦我点击另一个选项卡或另外2-3个不同的选项卡获取数据的性能仍然很棒..但在我获得数据后我滚动页面其可怕。滚动条有时会跳转,因为它无法跟上我想要浏览页面的速度。
除了完全转储更新面板之外,我不知道还有什么办法可以加快这个页面,但是有太多的工作和时间来做这件事。到目前为止,我尝试了以下内容:
always
更改为conditional
childrenastriggers
更改为false
我还能做些什么来解决这个问题或者还有什么可能导致延迟缓慢?如上所述,获取数据的速度非常快,当我上下移动(滚动)页面时,这是非常不稳定的。 I followed msdn's recommendation for how update panels refresh.
我仍然在努力寻找更好的方法。我试过用这个:
http://aspadvice.com/blogs/robertb/archive/2005/11/16/13835.aspx
这允许我处理服务器端的视图状态。效果是html标记已经摆脱了所有的视图状态信息,然而,我仍然有的问题还没有解决的事实是,当我继续通过页面上的触发事件做异步回发时,我的页面减慢了。我的意思是减速是因为我向上/向下滚动页面表现非常糟糕。当我滚动时,滚动条基本上可以跟上我。因此,即使在客户端页面上摆脱生成的视图状态信息,我仍然遇到滚动条非常慢的问题。这又发生在页面上的事件,例如过滤器/点击事件或网格上的排序或页面索引更改(基本上是导致异步回发的任何事件)。
如果有人有其他想法,请随时加入。
答案 0 :(得分:6)
最后我得到了这个......这个问题与我在这里找到的另一个问题有关:Why is telling jQuery to click my link button slowing my page down?
它的主旨是我在更新面板之外的控件上订阅事件。实际上,基于在我的jquery中重新订阅,加倍,三倍或附加n个事件。请参阅我发布的链接。
答案 1 :(得分:0)
获取数据的表现绝对没问题 - 这不是我的问题。
我现在的问题是我在页面上下滚动表现 开始退化。
你确定这是由于异步回发吗?您一次尝试在页面上显示多少数据?
如果浏览器正在执行多个回发,那么更新面板可能是罪魁祸首。但听起来好像页面加载和更新很好,浏览器正在努力渲染文档。如果没有关于该页面的更多具体细节,我们无法确定。
我的建议是,它可能不是更新面板问题,而是分页问题。您是否有任何选项可以分解您的数据并且一次只显示几个块?
答案 2 :(得分:0)
我在更新面板中包含大量数据的treeview遇到了巨大的性能问题。如果您有树视图,它可以“使”页面在所需的回发后自行获得完整的回发。追踪将告诉故事。最后我写了一个ajax包装器并自己完成了部分回发。 Treeview可以是一个朋克。
如果您没有树视图,请忽略。
编辑:如果重要的话,我在树视图中有大约250个项目,最多4个。