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

C++的性能C#的产能?! - .Net Native 系列四:性能测试方法(PerfView)的更多相关文章

  1. C++的性能C#的产能?! - .Net Native 系列五:.Net Native与反射

    此系列系小九的学堂原创翻译,翻译自微软官方开发向导,一共分为六个主题.本文是第五个主题:.Net Native与反射. 向导文链接:<C++的性能C#的产能?! - .Net Native 系列 ...

  2. C++的性能C#的产能?! - .Net Native 系列《三》:.NET Native部署测试方案及样例

    之前一文<c++的性能, c#的产能?!鱼和熊掌可以兼得,.NET NATIVE初窥> 获得很多朋友支持和鼓励,也更让我坚定做这项技术的推广者,希望能让更多的朋友了解这项技术,于是先从官方 ...

  3. C++的性能C#的产能?! - .Net Native 系列《二》:.NET Native开发流程详解

    之前一文<c++的性能, c#的产能?!鱼和熊掌可以兼得,.NET NATIVE初窥> 获得很多朋友支持和鼓励,也更让我坚定做这项技术的推广者,希望能让更多的朋友了解这项技术,于是先从官方 ...

  4. C++的性能C#的产能?! - .Net Native 系列《一》:.NET Native安装和配置

    之前一文<c++的性能, c#的产能?!鱼和熊掌可以兼得,.NET NATIVE初窥> 获得很多朋友支持和鼓励,也更让我坚定做这项技术的推广者,希望能让更多的朋友了解这项技术,于是先从官方 ...

  5. C++的性能C#的产能?! - .Net Native 系列向导

    之前一文<c++的性能, c#的产能?!鱼和熊掌可以兼得,.NET NATIVE初窥> 获得很多朋友支持和鼓励,也更让我坚定做这项技术的推广者,希望能让更多的朋友了解这项技术,于是先从官方 ...

  6. React Native 系列(四) -- 布局

    前言 本系列是基于React Native版本号0.44.3写的.RN支持CSS中的布局属性,因此可以使用CSS布局属性,这里就不详细地讲解了,这篇文章的重点主要是讲述一下RN中的Flex布局. CS ...

  7. React Native 系列(四)

    前言 本系列是基于React Native版本号0.44.3写的.RN支持CSS中的布局属性,因此可以使用CSS布局属性,这里就不详细地讲解了,这篇文章的重点主要是讲述一下RN中的Flex布局. CS ...

  8. c++的性能, c#的产能?!鱼和熊掌可以兼得,.NET NATIVE初窥

    对于微软开发者来说,每次BUILD大会都是值得期待的.这次也是惊喜满满,除了大众瞩目的WP8.1的发布还有一项会令开发者兴奋的技术出现:.NET NATIVE.下面就来详细了解一下其为何物. [小九的 ...

  9. Java性能分析之线程栈详解与性能分析

    Java性能分析之线程栈详解 Java性能分析迈不过去的一个关键点是线程栈,新的性能班级也讲到了JVM这一块,所以本篇文章对线程栈进行基础知识普及以及如何对线程栈进行性能分析. 基本概念 线程堆栈也称 ...

随机推荐

  1. .NET面试题系列[8] - 泛型

    “可变性是以一种类型安全的方式,将一个对象作为另一个对象来使用.“ - Jon Skeet .NET面试题系列目录 .NET面试题系列[1] - .NET框架基础知识(1) .NET面试题系列[2] ...

  2. 【前端性能】高性能滚动 scroll 及页面渲染优化

    最近在研究页面渲染及web动画的性能问题,以及拜读<CSS SECRET>(CSS揭秘)这本大作. 本文主要想谈谈页面优化之滚动优化. 主要内容包括了为何需要优化滚动事件,滚动与页面渲染的 ...

  3. MySQL数据库和InnoDB存储引擎文件

    参数文件 当MySQL示例启动时,数据库会先去读一个配置参数文件,用来寻找数据库的各种文件所在位置以及指定某些初始化参数,这些参数通常定义了某种内存结构有多大等.在默认情况下,MySQL实例会按照一定 ...

  4. JavaScript正则表达式,你真的知道?

    一.前言 粗浅的编写正则表达式,是造成性能瓶颈的主要原因.如下: var reg1 = /(A+A+)+B/; var reg2 = /AA+B/; 上述两个正则表达式,匹配效果是一样的,但是,效率就 ...

  5. C++的内存泄漏检测

    C++大量的手动分配.回收内存是存在风险的,也许一个函数中一小块内存泄漏被重复放大之后,最后掏空内存. 这里介绍一种在debug模式下测试内存泄漏的方法. 首先在文件的开头以确定的顺序写下这段代码: ...

  6. Android Fragment 剖析

    1.Fragment如何产生?2.什么是Fragment Android运行在各种各样的设备中,有小屏幕的手机,超大屏的平板甚至电视.针对屏幕尺寸的差距,很多情况下,都是先针对手机开发一套App,然后 ...

  7. iOS开发--ChildViewController实现订单页的切换

    先不说废话, 上效果图, 代码量也不大, 也不上传github骗星星了, 你们复制粘贴下代码, 就可以轻而易举的弄出一个小demo. 这个代码的实现并不复杂, 甚至于说非常简单, 就是逻辑有点小绕, ...

  8. docker4dotnet #1 – 前世今生 & 世界你好

    作为一名.NET Developer,这几年看着docker的流行实在是有些眼馋.可惜的是,Docker是基于Linux环境的,眼瞧着那些 java, python, node.js, go 甚至连p ...

  9. 【每日一linux命令2】命令执行顺序:

    二.命令顺序:     若在 shell 内置的命令/bin 以及/usr/bin 之下都出现了命令 pwd,那当我们执行该命令时,会执行哪 一个?答案是第一优先执行 shell 内置的命令,再执行路 ...

  10. C#编写windows服务,多服务为什么只启动一个(ServiceBase.Run)

    https://zhidao.baidu.com/question/380395667.html //多服务一个宿主程序时必须注间以下要点: Service1的ServiceName 必须 Insta ...