【问题标题】:What is the order of execution of the C# in RazorRazor中C#的执行顺序是什么
【发布时间】:2012-03-04 06:06:15
【问题描述】:

想了解Razor引擎如何执行以@开头的c#代码的顺序。

我试图查看执行控制器和执行视图的不同时间。因此,我创建了这个非常简单的 ASP.NET MVC 应用程序。我将时间存储在控制器中的ViewBag 变量中并显示视图,我还在视图中显示当前时间。

控制器有这个:

public ActionResult Index()
{
    ViewBag.ProcessingTime = DateTime.Now;
    return View();
}

视图有这样的:

Processing time: @ViewBag.ProcessingTime<br />

    @{
        int i = 0;
        do
        {
            i++;
            <text>@i<br /></text>
        }
        while (i < 1000000);
        }

Render time: @DateTime.Now 

结果是这样的:

Processing time: 03/03/2012 04:16:48 p.m.
1
2
3
4
[...]
999998
999999
1000000
Render time: 03/03/2012 04:16:48 p.m.

为什么在执行if时向我显示网页显然需要时间,Controller 中的 ProcessingTime 和视图中的 RenderTime 相同?

【问题讨论】:

  • @AndrewBarber - 绘制所有一百万行文本确实需要时间。
  • @TravisJ 此代码中没有任何“绘图”。
  • @Andrew 我想是因为向我展示该页面需要很多时间。现在我明白延迟是因为浏览器。不显示任何内容,但使用更大的数字我可以看到不同的时间。谢谢!
  • @RicardoPolo Gotcha;我什至无法想象你为什么认为这需要很长时间,因为我只考虑运行速度非常快的代码,而不是在浏览器中下载/显示结果所需的时间。跨度>
  • @RicardoPolo,我建议您阅读YSlow Best Practices 以优化您的网站。您将意识到大部分时间都在传输和渲染中丢失,而不是在服务器上。您可以通过遵循一些规则轻松获得性能,而不是在服务器上浪费宝贵的时间和精力来赢得什么 - 20 毫秒的渲染?而您在客户端上浪费了 5 秒。许多人专注于优化他们的服务器端代码,却没有意识到这不是问题所在。当然这并不意味着...

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


【解决方案1】:

请记住,页面是在服务器上呈现的。因此,即使它在您看来它在客户端上看起来非常缓慢(因为您正在发送巨大的 HTML),实际渲染发生在服务器上,并且可能会在不到一秒的时间内发生,因为您所做的只是循环超过 100 万元素。

尝试显示处理器滴答声,您应该会注意到其中的差异(如果您没有注意到,则肯定存在根本性错误):

Processing time: @ViewBag.ProcessingTime.Ticks

... your loops and stuff

Render time: @DateTime.Now.Ticks

所以实际执行如下:

  1. 客户端请求/home/index
  2. 控制器动作执行,将当前时间存储在 ViewBag 中并开始执行视图。
  3. 视图的执行只是循环并将 1M 元素转储到响应流中,这发生得非常快,可能不到一秒。因此,当它在不到一秒左右的时间内到达视图的最后一行时,会将最后一行发送给客户端。
  4. 此流到达客户端需要大量时间(与在服务器上执行相比)。
  5. 客户端构建 DOM 树并显示它需要大量时间(与服务器上的执行相比)。
  6. 最后,客户端显示了在服务器上快速生成的状态。
  7. 在您的浏览器中,您观察到的时间非常接近,但在此浏览器中此页面呈现之间发生了很多时间。

【讨论】:

  • 绘制所有一百万个文本字段需要一段时间。
  • @TravisJ,此绘图发生在客户端上。这就是为什么它很慢。实际代码在服务器上执行。有很大的不同。服务器上两次 DateTime 测量之间经过的时间非常短。
  • @TravisJ 服务器没有“绘制”任何东西。它只是将数据转储到缓冲流中。这发生非常快
  • @TravisJ 我很困惑为什么你认为 Razor 与此有​​关。默认情况下缓冲输出。它在 WebForms 中的工作方式相同,或者如果您在 Controller 中使用 Response.Write() 调用生成页面。
  • @TravisJ,将所有路由解析、控制器操作执行和剃刀视图渲染视为发生在服务器上并将响应流式传输到套接字的单个 IHttpHandler.ProcessRequest 操作。
猜你喜欢
  • 2013-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多