之前一文《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
![]() |
---|
這個主題依賴於預發行的.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%,可能是我的測試壞境會有一些影響。總之性能提升還是非常顯著的!