2012-03-03 85 views
-1

我想了解剃刀引擎如何執行以@開頭的c#代碼的順序。什麼是在剃刀執行C#的順序

我正在嘗試查看Controller執行並執行視圖時的不同時間。所以,我創建了這個非常簡單的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,並且t他在視圖中的RenderTime是一樣的嗎?

+0

@AndrewBarber - 繪製所有100萬條文字線需要時間。 – 2012-03-03 21:49:00

+3

@TravisJ此代碼中沒有任何「繪圖」。 – 2012-03-03 21:51:38

+0

@Andrew我以爲,因爲它需要很多時間才能讓我看到頁面。現在我明白延遲是因爲瀏覽器。不要顯示任何內容,只能使用更大的數字,我可以看到不同的時間。謝謝! – 2012-03-03 22:12:47

回答

4

請記住,服務器上的頁面呈現爲。因此,即使它在視覺上對客戶來說顯得非常緩慢(因爲您發送的是一個巨大的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. 在您的瀏覽器中,您觀察到非常接近的時間,並且在此瀏覽器中的此頁面呈現之間發生了很多時間。
+0

繪製所有一百萬個文本字段需要一段時間。 – 2012-03-03 21:48:25

+2

@TravisJ,此繪圖在客戶端**上發生。這就是爲什麼它很慢。實際的代碼在服務器**上執行**。有很大的差異。服務器上兩次DateTime測量之間的時間間隔非常小。 – 2012-03-03 21:50:54

+3

@TravisJ服務器不是「繪製」任何東西。它只是將數據轉儲到緩衝區流中。發生這種情況*非常快* – 2012-03-03 21:52:32

相關問題