ASP.NET MVC - 使用MVC MiniProfiler測試您的網頁跑多快

在MVC 3專案中,NuGet 指令:Install-Package MiniProfiler

在修改 Global.asax.vb

Imports MvcMiniProfiler

Sub Application_BeginRequest()
    ' 如果是本機連線,MiniProfiler才啟用
    If Request.IsLocal() Then
        MiniProfiler.Start()
    End If
End Sub

Sub Application_EndRequest()
    MiniProfiler.Stop()
End Sub

接下來,我們修改Site.Master,
  1. 先載入 jQuery
  2. MiniProfiler的Render設定

<!-- MVC預設有載入jQuery,另在 </head>之前加上以下程式碼即可 -->
<%: MvcMiniProfiler.MiniProfiler.RenderIncludes() %>
</head>

下一步,是在 Controller 裡撰寫測試程式碼,測試程式碼必須使用 Using ~ End Using,例如,

Imports MvcMiniProfiler

Public Class HomeController
    Inherits System.Web.Mvc.Controller

    Function Index() As ActionResult
        ViewData("Message") = "歡迎使用 ASP.NET MVC!"

        ' 取得現在執行HttpContext內的MiniProfiler
        Dim mp As MiniProfiler = MiniProfiler.Current()

        ' Step,現在步驟
        Using mp.Step("Doing complex stuff")
            Using mp.Step("Step A")
                ' 做一些事
                System.Threading.Thread.Sleep(100)
            End Using

            Using mp.Step("Step B")
                ' 做一些事
                System.Threading.Thread.Sleep(250)
            End Using
        End Using

        Return View()
    End Function

    Function About() As ActionResult
        Return View()
    End Function

End Class

讓我們將網頁執行起來,來看結果。


我們可以看到左上角多了一個數字,我們點擊一下,看內容。


對照一下我們的程式,第一次網頁啟動花費約二秒,Step A 我們Sleep(100),Step B我們Sleep(250),加一加約 2.3 秒。透過這樣的方法,可以讓我們非常明確了解,每一段程式碼執行的效率。就像李昌鈺博士所說:
「有一分證句,說一分話。」

資料庫測速

MiniProfiler還可以針對網頁與資料庫之間進行測速,不過我怎麼測都不成功,但還是有測出一些心得,所以寫下來。

他們會要你改寫 web.config ,例如,

<remove invariant="MvcMiniProfiler.Data.ProfiledDbProvider" />
<add name="MvcMiniProfiler.Data.ProfiledDbProvider"
     invariant="MvcMiniProfiler.Data.ProfiledDbProvider"
     description="MvcMiniProfiler.Data.ProfiledDbProvider"
     type="MvcMiniProfiler.Data.ProfiledDbProviderFactory, MvcMiniProfiler, Version=1.7.0.0, Culture=neutral, PublicKeyToken=b44f9351044011a3" />

測試時,一直出現錯誤,說他不認識這堆東西,後來我去查最上層的(C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\machine.config),要多加一個DbProviderFactories才對。

加在 <configuration> 之下。

<system.data>
    <DbProviderFactories>
        <remove invariant="MvcMiniProfiler.Data.ProfiledDbProvider" />
        <add name="MvcMiniProfiler.Data.ProfiledDbProvider"
             invariant="MvcMiniProfiler.Data.ProfiledDbProvider"
             description="MvcMiniProfiler.Data.ProfiledDbProvider"
             type="MvcMiniProfiler.Data.ProfiledDbProviderFactory, MvcMiniProfiler, Version=1.7.0.0, Culture=neutral, PublicKeyToken=b44f9351044011a3" />
    </DbProviderFactories>
</system.data>

然後修改 Global.asax.vb

Sub Application_Start()
    AreaRegistration.RegisterAllAreas()

    RegisterGlobalFilters(GlobalFilters.Filters)
    RegisterRoutes(RouteTable.Routes)

    ' 新增以下MiniProfiler設定
    MiniProfiler.Settings.SqlFormatter = new MvcMiniProfiler.SqlFormatters.SqlServerFormatter()
    ' SqlCeConnectionFactory 必須傳入資料庫連線字串
    Dim factory = new System.Data.Entity.Infrastructure.SqlCeConnectionFactory("Data Source=.\sqlexpress;Initial Catalog=Northwind;Integrated Security=True")
    Dim profiled = new MvcMiniProfiler.Data.ProfiledDbConnectionFactory(factory)
    System.Data.Entity.Database.DefaultConnectionFactory = profiled
End Sub

而且在測試過程中發現,我是使用 Entity Framework 4.1 (DbContext),目前看來是還無法使用資料庫部份功能,因為現在 MiniProfiler 目前只支援 ObjectContext 物件,我都還沒傳進去就 Visual Studio 就已經跟我報錯了!@_@

另外小小抱怨一下,它的說明文件嚴重不足,

參考資料:

沒有留言:

張貼留言

感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。