【问题标题】:Asp.Net application performanceAsp.Net 应用程序性能
【发布时间】:2023-11-09 03:00:01
【问题描述】:

我看到 .Net 中的 Web 开发世界现在分为 Asp.Net Webforms 和 MVC,第三类更喜欢在同一个应用程序中使用两者。

我的问题:ViewState 通常被视为邪恶,是大多数应用程序的主要性能瓶颈。但是,如果我们正确使用它,那么我根本看不到任何问题。关于 Asp.Net MVC 3.0/4.0 beta 的讨论太多了,而且它没有 ViewState。

但我担心的是,Asp.Net MVC 如何帮助提高性能,因为在我看来,我们在

中绑定了控件
if (!IsPostback) {}

在 Asp.Net MVC 中,我们每次都绑定控件,并可能在每次发布表单时发出数据库请求。 Asp.Net Winforms 在这方面不占上风吗?能否保证 Asp.Net MVC 在所有情况下都表现得更好?

编辑:我不想引发任何争议,而且我只是在谈论 Asp.Net 代码,而不是在 Javascript 缩小、CSS 缩小和所有其他技巧之后的性能。

【问题讨论】:

  • 您要求绝对保证,所以我可以放心地说“不,没有保证”。并且对这个答案感到很自在。有太多因素需要考虑,但根据我的经验,对于等效页面,它通常具有更轻、更快的感觉。不要忘记通过网络传输非本地连接的 ViewState 的性能,并且浏览器必须在 DOM 中处理,等等。并非所有性能项都在 ASP.NET 管道中。
  • 没有。影响 Web 应用程序性能的因素有很多。您可以编写糟糕的 MVC 代码,也许不像在 WebForms 中那么容易,但它仍然是可能的。最重要的是,充分了解 Web 应用程序管道和性能瓶颈(与任何框架无关)是关键。

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


【解决方案1】:

所有优秀的答案都在这里,但我也会投入我的 2 美分。

当您使用if (!IsPostBack) 绑定控件时,您正在将加密的视图状态字段写入网络表单页面。在下一个请求期间,所有这些状态都被发送到您的服务器并被解密/反序列化。如果您在页面上有一个 GridView,它的所有行都将处于视图状态,因此您无需再次发出 db 请求来再次对其进行数据绑定。

从这个意义上说,它可以在您的服务器上提高性能。但是,正如这里的其他人所说,您将所有视图状态发送到服务器会受到网络冲击。此外,您需要将状态向下推。听起来您故意保持视图状态轻,以克服潜在的视图状态滥用并使 Web 表单性能更好。这绝对是一个好习惯,因为视图状态经常被滥用甚至被忽略。

考虑将分页的 GridView 下推到客户端的示例。如果您的 GV 包含 15 行,您可能会通过将其全部推送到客户端、在返回的途中反序列化它并且在第一次加载后不访问数据库来获得更好的性能。但是,当您的 GV 包含 1500 行时,如果您不在视图状态下发送它,最终用户可能会看到更好的性能,而是在每个分页请求期间点击数据库。 (但是,一旦他们从 GV 链接到详细信息页面,然后单击“返回”按钮,他们就会被要求重新发布他们的数据——这总是很烦人,不管有多少行)。

最终,当您在提供和使用网络表单页面的机器上进行开发时,性能可能看起来更好。但是根据您的视图状态的大小,通过网络访问内容的人可能看不到您的速度。 It all depends on how fat your viewstate is

我认为很多 MVC 粉丝喜欢它的原因之一是因为他们only need to send the minimal request to the server that is needed to perform a specific action。我们可以拆分表单并仅将部分或块发送到不同的操作,而不是反序列化整个表单,而不是使用 1 个单一的表单来提交页面上所有 Web 控件的所有数据和状态。

正如其他人在这里所说,对您的问题的简短回答是否定的,MVC 并不总是比网络表单更快或性能更好。没有黑白之分。在许多情况下,它可以而且确实如此,但正如其他人所说,some apps are better suited for webforms。另外,性能是您唯一关心的问题吗? MVC 在其他领域确实比 Web 表单具有黑白优势,即使性能可能总是“依赖”。

【讨论】:

  • 我最喜欢你的回答。但是我没有向客户端推送 1500 行:)。最多我服务器 50 行,最多 7 列 :)。顺便说一句,它没有加密它是编码的(Base64)。
  • 很好,但您在原始问题中没有提到这一点。我只是想解释为什么 MVC 在 Web 表单上存在“嗡嗡声”,以及它如何在某些情况下表现得更好。
  • 我还有其他关于 MVC 的安全问题。可能我会在其他问题中发布它。不是今天,我每天 6 个问题的配额已经用完了 :)。
  • RE 性能,请记住,您还可以采取其他措施来使应用程序在 MVC 或 WebForms 中表现得更好,例如缓存、纵向扩展/横向扩展和 CDN。
【解决方案2】:

我个人认为 MVC 更适合需要显示较轻内容的网站。但是,如果您需要为日内交易者构建网格,那么 Web 表单会占上风。

ASP.net MVC 不像 asp.net web 表单那样绑定控件。

您需要使用 JQuery 来执行此操作。 Jquery 的性能非常好。

http://www.codeproject.com/Articles/305308/MVC-Techniques-with-JQuery-JSON-Knockout-and-Cshar

同样重要的是要提到 MVC\jquery 需要更高级别的专业知识。因此,在成本方面,您必须注意底线。成本通常被程序员忽略,但它在任何项目中都扮演着重要的角色。

【讨论】:

    【解决方案3】:

    mvc(无论是 MS 还是任何其他框架)更符合 Web 的无状态性质和概念。

    webforms 旨在使 Web 开发的行为更像一个有状态的桌面客户端。这就是页面事件、回发和视图状态存在的原因。

    我看到了 50MB 的视图状态。这肯定会损害性能。使用 mvc 框架,您可以相当快地减小页面大小。然而,mvc 的优点是 1. 简单(相对于 webforms 页面生命周期)和 2. 可扩展性。

    如果您不喜欢控制器工厂、验证或视图引擎的默认实现,您可以将其换成 mvc。使用您无法使用的网络表单。

    【讨论】:

      【解决方案4】:

      我不能说 MVC 的优势在于性能,尽管我认为它可能更快。它的优点是不处理控件的类似 winforms 的生命周期。单个页面上的内容越多,开发就不会变得越复杂,如果使用控件,如果操作不当,它们的生命周期事件经常会相互影响。

      关于性能,MVC 的生命周期是静态的。发生了一些事件,但这并没有太大变化。性能问题存在于您的操作方法中。使用网络表单,每次回发时都会发生多个事件和控件重新创建,即使控件未使用或不可见也是如此。 Web 表单中的浪费要多得多,这使得 MVC 相对而言更精简并且可以提供更好的性能。

      【讨论】:

        最近更新 更多