zoukankan      html  css  js  c++  java
  • C++的性能C#的产能?!

      之前一文《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%,可能是我的测试坏境会有一些影响。总之性能提升还是非常显著的!

  • 相关阅读:
    printcap
    browser-ua
    PHP 开发 APP 接口 学习笔记与总结
    Java实现 LeetCode 72 编辑距离
    Java实现 LeetCode 72 编辑距离
    Java实现 LeetCode 72 编辑距离
    Java实现 LeetCode 71 简化路径
    Java实现 LeetCode 71 简化路径
    Java实现 LeetCode 71 简化路径
    Java实现 LeetCode70 爬楼梯
  • 原文地址:https://www.cnblogs.com/xfuture/p/3738245.html
Copyright © 2011-2022 走看看