C++的性能C#的產能?! - .Net Native 系列四:性能測試方法(PerfView)


  之前一文《c++的性能, c#的產能?!魚和熊掌可以兼得,.NET NATIVE初窺》 獲得很多朋友支持和鼓勵,也更讓我堅定做這項技術的推廣者,希望能讓更多的朋友了解這項技術,於是先從官方信息的翻譯開始做起。

  此系列系小九的學堂原創翻譯,翻譯自微軟官方開發向導,一共分為六個主題。本文是第四個主題:.NET Native性能測試

 

  向導文鏈接:C++的性能C#的產能?! - .Net Native 系列:開發向導

 

  [小九的學堂,致力於以平凡的語言描述不平凡的技術。如要轉載,請注明來源:小九的學堂cnblogs.com/xfuture]

 


 

    原文:Measuring Startup Improvement with .NET Native

 .NET Native性能測試

.NET Framework 4.5

    

Note 小貼士

這個主題依賴於預發行的.net native開發者預覽版。下載地址: Microsoft Connect website. 友情提示需要注冊..

  

  .net native顯著提升了程序的啟動時間,尤其是在低配置的設備和復雜程序上尤其明顯。本主題將會告訴大家如何測試啟動性能的提升。

  .net framework和windows使用了windows事件日志(ETW)的event tracing機制來進行性能測試。它可是使你的程序在觸發事件時通知工具來進行記錄。你可以使用PerfView來查看和分析ETW事件日志。

  

  下面主題將會分如下三步來進行闡述:

  1. 使用EventSource類來觸發事件。  

  2. 使用PerfView來收集事件。

  3. 使用PerfView來進行事件分析。

 

  使用EventSource類來觸發事件


  EventSource提供了一個可以自定義事件處理方法的基類。創建一個子類並繼承它,重寫它事件的方法。每一個eventsource都是單例模式

  下面的類用來測試兩個部分:1. app class構造函數被調用的時間 2. MainPage被調用的時間

  

using System;
using System.Diagnostics.Tracing;

[EventSource(Name="MyCompany-MyApp")]
public sealed class AppEventSource : EventSource
{
   public static AppEventSource Log = new AppEventSource ();

  // The numbers passed to WriteEvent and EventAttribute 
  // must increment with each logging method.  
  [Event(1)]
  public void AppInitialized() { WriteEvent(1, ""); }

  [Event(2)]
  public void MainPageInitialized() { WriteEvent(2, ""); }
}

   有幾點需要注意:1. 在AppEventSource.Log里會創建一個單例的實例,該實例用於記錄所有的日志。2. 每一個事件的方法都有一個Event的屬性,這有助於關聯WriteEvent索引和在該類上被調用的方法。

  上面代碼中的兩個事件僅作為范例。在上面兩個事件觸發后,絕大部分程序會開始運行。您應該了解運行中通過和用戶交互會觸發哪些其他的事件,並進行記錄。這些事件記錄在一個單例的日志里,這個對每個操作的起始和結束的記錄非常有用。當檢查程序啟動的時候,一般來說啟動事件都是操作系統發出的“Process/Start”事件。

 

  舉例說明:你要創建一個RSS閱讀器,有幾個事件是需要記錄的:

  1. 主頁第一次呈現。

  2. 舊的RSS文章從本地存儲反序列化到內存里。

  3. 當你的app開始同步新的RSS文章。

  4. 當你的app結束同步新的RSS文章。

  插入:很簡單,只需要在相應位置調用AppEventSource.Log里的方法就可以記錄了。

  

using System;
using Windows.ApplicationModel;
using Windows.UI.Xaml; 

public sealed partial class App
{
    public App()
    {
        this.InitializeComponent();
        this.Suspending += OnSuspending;
        AppEventSource.Log.AppInitialized();
    }
} 
public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();
        AppEventSource.Log.MainPageInitialized();
    }
}

  app啟動后,就可以對這些事件進行收集了。

 

  使用PerfView收集事件


  PerfView使用ETW事件來進行各種性能測試信息的收集和研究。通過配置界面可以配置記錄不同類型的事件。PerfView免費,可以在microsoft下載中心進行下載,教學視頻

  需要注意的是PerView不能收集ARM的事件,ARM事件需要使用Windows性能記錄儀(WPR),關於WPF,可以點擊Vance Morrison的博客

 

  你也可以通過命令行來打開PerView:CMD->輸入: perfview -KernelEvents:Process -OnlyProviders:*MyCompany-MyApp collect outputFile

  -KernelEvents:Process 表示記錄程序起始和結束時間。-OnlyProviders:*MyCompany-MyApp 關閉其他的PerfView監視,開啟屬於自己的PerfView。collect outputFile 表示開始收集日志並將數據存入outputFile.etl.zip.

 

  開啟PerfView后打開你的app。有些點需要注意:

  1. 使用release版本。debug版本包含了錯誤檢查和調試代碼,影響測試。

  2. 附加的調試器(Attach)會影響性能測試。

  3. Windows使用了緩存策略,以加快應用程序啟動。如果你的app當前緩存在內存中,啟動不需要從磁盤,則會迅速很多。所以在測試前,多關閉你的應用程序幾次。或者注銷。

  4. app運行時perfview就會收集信息,當停止時點擊停止收集按鈕。如果想收集關閉程序時的狀態,則關閉app后再停止收集。

 

  使用PerfView來進行事件分析


  使用PerfView打開生成的.etl 或者 .etl.zip 后綴的文件既可以觀察到收集的事件。ETW收集了包括其他進程的很多應用的日志。所以當你專注於分析自己app的時候,你還需要:

  1. 在Process Filter欄 輸入你的app在進程中的名字。

  2. 在Event Types Filter欄 選擇 Process/Start | MyCompany-MyApp。可以篩選出啟動停止的事件。

  

  選擇左邊窗口所有的事件(Ctrl+A),點擊回車。你就可以看到各個事件的時間段。這些時間都是相對於起始來進行計算的。

  按着Ctrl點擊兩個時間段,你就可以在底部看出兩者的異處。可以選擇導出成csv或者excel來進行報告的導出和保存。

  

  通過.net app和.net native app性能測試的比較,就可以得出.net native的性能提升。

  本人對一個app進行了初步的測試和比較,性能提升雖不如官網所寫60%,但也有43.5%,可能是我的測試壞境會有一些影響。總之性能提升還是非常顯著的!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM