Asp.net mvc C#in剃须刀的执行顺序是什么

Asp.net mvc C#in剃须刀的执行顺序是什么,asp.net-mvc,asp.net-mvc-3,razor,Asp.net Mvc,Asp.net Mvc 3,Razor,我想了解Razor引擎如何执行以@开头的c代码 我试图查看控制器执行和视图执行的不同时间。因此,我创建了这个非常简单的ASP.NET MVC应用程序。我将时间存储在控制器中的ViewBag变量中,并将其显示在视图中,同时在视图中显示当前时间 控制器具有以下功能: public ActionResult Index() { ViewBag.ProcessingTime = DateTime.Now; return View(); } Processing time: @ViewB

我想了解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 
有以下观点:

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 

为什么当网页执行
时显示网页明显需要时间?如果控制器中的处理时间和视图中的渲染时间相同,请记住网页在服务器上呈现。因此,即使在视觉上,它在客户机上的显示速度非常慢(因为您正在发送一个巨大的HTML),实际的渲染也会发生在服务器上,而且可能在不到一秒钟的时间内发生,因为您所做的只是循环100多万个元素

尝试显示处理器滴答声,您应该会注意到一个差异(如果您没有注意到,则一定是根本错误):

因此,实际执行情况如下:

  • 客户端请求
    /home/index
  • 控制器动作执行,将当前时间存储在ViewBag中,并开始执行视图
  • 视图的执行只是循环并将1M个元素转储到响应流中,这发生得非常快,可能不到一秒钟。因此,当它在不到一秒钟的时间内到达视图的最后一行时,最后一行将被发送到客户端
  • 此流到达客户端需要很多时间(与服务器上的执行相比)
  • 客户机构建并显示DOM树需要很多时间(与服务器上的执行相比)
  • 最后,客户端显示服务器上生成的内容的状态,该状态发生得非常快
  • 在您的浏览器中,您可以观察到非常接近的时间,但在此浏览器中呈现此页面的时间间隔非常长

  • 绘制所有一百万个文本字段需要一段时间。@TravisJ,这个绘制是在客户机上进行的。这就是它慢的原因。实际代码在服务器上执行。这是一个巨大的差异。服务器上两次日期时间测量之间的时间非常短。@TravisJ服务器没有“绘制”任何内容。它只是将数据转储到一个红色的缓冲流中。这种情况经常发生fast@TravisJ我不明白你为什么认为Razor和这件事有关。默认情况下,输出是缓冲的。在WebForms中,或者如果您在控制器中使用
    Response.Write()
    调用生成页面,则其工作原理相同。@TravisJ,想想所有的路由解析,控制器操作执行和razor视图呈现为单个IHttpHandler.ProcessRequest操作,该操作发生在服务器上,并将响应流式传输到套接字。@AndrewBarber-绘制所有一百万行文本确实需要时间。@TravisJ在这段代码中没有任何“绘制”过程。@Andrew我认为这需要很多时间让我看看这一页。现在我明白延迟是因为浏览器。不显示任何内容,但使用更大的数字,我可以看到不同的时间。谢谢@李嘉图;我甚至无法想象你为什么认为这需要很长时间,因为我只考虑运行速度非常快的代码,而不考虑在浏览器中下载/显示结果所需的时间。@RicardoPolo,我建议你阅读以优化网站。您将认识到,大部分时间是在传输和渲染过程中损失的,而不是在服务器上。通过遵循一些规则,而不是在服务器上浪费宝贵的时间和精力来赢得20毫秒的渲染,您可以非常轻松地获得性能?而你在客户端上浪费了5秒钟。许多人专注于优化服务器端代码,却没有意识到这不是问题所在。当然这并不意味着。。。