RenderAction与RenderPartial性能

时间:2012-06-27 14:16:15

标签: asp.net-mvc asp.net-mvc-3

根据Brad Wilson的说法,RenderAction 比RenderPartial慢。

但是,有没有人有任何显示性能差异的统计数据?

我正在开发一个应用程序,其中页面由“窗口小部件”组成。

我有两个选择:

观看级别的构图

为每个小部件调用RenderAction。这是迄今为止最简单的方法,但这意味着我们正在为每个小部件执行完整的MVC循环。

控制器级别的构成

为包含每个小部件所需数据的页面编写一个ViewModel。为每个小部件调用RenderPartial。这实现起来要复杂得多,但这意味着我们只会制作一个MVC周期。

我在页面上用3个不同的小部件测试了上述方法,渲染时间的差异是十分之一秒(几乎不值得担心)。

但是,有没有人比任何测试结果更具体,或者尝试两种方法?

2 个答案:

答案 0 :(得分:4)

我最近处理过一个遇到性能问题的应用程序,发现一个视图正在对RenderAction进行四次调用,另外一次调用布局。我发现每次调用RenderAction - 即使我添加了一个返回空视图的虚拟动作 - 大概需要200-300ms(在我的本地机器上)。乘以调用次数,您在页面上获得了巨大的性能。在我的情况下,有四个调用导致大约一秒不必要的服务器端开销。相比之下,对RenderPartial的调用大约是0-10ms。

我会尽可能避免使用RenderAction来支持RenderPartial。控制器应负责返回所有必要的信息。对于小部件,如果您需要多个小部件的多个操作,我会尝试将它们组合成一个动作,因此RenderAction开销只发生一次,但如果您的网站充分执行,我会将它们分开以实现更清洁的设计。

编辑:我使用MiniProfiler收集了此信息并点击了该网站。它不是非常准确,但它确实显示了差异。

编辑:正如Oskar在下面指出的那样,有问题的应用程序可能会为global.asax中的每个请求运行一些密集的代码。此命中的大小取决于应用程序代码,但RenderPartial将完全避免执行另一个MVC循环。

答案 1 :(得分:3)

我建议另外两个选项,都需要在Controller级别组合视图模型,两者都可以一起工作(取决于数据)

  1. Html.DisplayFor() - 显示模板
  2. 通过扩展方法帮助
  3. 如果你想将这些小部件保存在不同的程序集中,选项2的效果非常好,毕竟它们只是返回字符串的函数。我认为它也有最好的表现,但当然你失去了“设计师友好”的模板。我认为考虑可维护性方面很重要,不仅仅是原始性能(直到你真正需要它,即使这样,缓存也会更有帮助)。

    对于小东西(日期或名称格式化等)我会使用助手,因为html通常是带有类的跨度,对于更复杂的东西我会使用显示模板。