Ben*_*ter 6 asp.net-mvc asp.net-mvc-3
据布拉德·威尔逊的RenderAction 是比慢的RenderPartial.
但是,有没有人有任何显示性能差异的统计数据?
我正在开发一个页面由"Widgets"组成的应用程序.
我有两个选择:
视图级别的组合
为每个小部件调用RenderAction.这是迄今为止最简单的方法,但这意味着我们正在为每个小部件执行完整的MVC循环.
控制器级别的组成
为包含每个小部件所需数据的页面构建一个ViewModel.为每个小部件调用RenderPartial.这实现起来要复杂得多,但这意味着我们只会制作一个MVC周期.
我在页面上用3个不同的小部件测试了上述方法,渲染时间的差异是十分之一秒(几乎不值得担心).
但是,有没有人比这更具体的测试结果,或者尝试两种方法?
我最近研究了一个遇到性能问题的应用程序,发现一个视图对 RenderAction 进行了四次调用,另外还有一个在布局中。我发现对 RenderAction 的每次调用——即使我添加了一个返回空视图的虚拟动作——也需要大约 200-300 毫秒(在我的本地机器上)。乘以调用次数,您就会在页面上获得巨大的性能提升。在我的例子中,有四次调用导致了大约一秒钟的不必要的服务器端开销。相比之下,对 RenderPartial 的调用大约在 0-10 毫秒的范围内。
我会尽可能避免使用 RenderAction 以支持 RenderPartial。控制者应负责返回所有必要的信息。在小部件的情况下,如果您需要多个小部件的多个动作,我会尝试将它们组合成一个动作,这样 RenderAction 开销只会发生一次,但如果您的网站性能良好,我会将它们分开以实现更简洁的设计。
编辑:我使用 MiniProfiler 收集了这些信息并点击了网站。它不是非常准确,但它确实清楚地显示了差异。
编辑:正如 Oskar 在下面指出的那样,有问题的应用程序可能有一些为 global.asax 中的每个请求运行的密集代码。此命中的大小将取决于应用程序代码,但 RenderPartial 将完全避免执行另一个 MVC 循环。
我建议另外两个选项,两者都需要在控制器级别组成视图模型,并且两者都可以一起工作(取决于数据)
如果您想将这些小部件保留在不同的程序集中,选项 2 非常有效,毕竟它们只是返回字符串的函数。我认为它也具有最好的性能,但当然你会失去“设计师友好”的模板。我认为考虑可维护性方面很重要,而不仅仅是原始性能(直到您真正需要它,即使这样,缓存也更有帮助)。
对于小东西(日期或名称格式等),我会使用助手,因为 html 通常是带有类的跨度,对于更复杂的东西,我会使用显示模板。
| 归档时间: |
|
| 查看次数: |
2997 次 |
| 最近记录: |