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

    







 小贴士

这个主题依赖于预发行的.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被调用的时间

  

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

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里的方法就可以记录了。

  

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

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();

    }

<span style="color: rgb(0, 51, 102);">}

</span>

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

时间: 2024-10-29 04:22:05

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

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

之前一文<c++的性能, c#的产能?!鱼和熊掌可以兼得,.NET NATIVE初窥> 获得很多朋友支持和鼓励,也更让我坚定做这项技术的推广者,希望能让更多的朋友了解这项技术,于是先从官方信息的翻译开始做起. 此系列系小九的学堂原创翻译,翻译自微软官方开发向导,一共分为六个主题.本文是第一个主题:.NET Native安装和配置. 向导文链接:<C++的性能C#的产能?! - .Net Native 系列:开发向导> [小九的学堂,致力于以平凡的语言描述不平凡的技术.如要转载,请注

React Native 系列(四)

前言 本系列是基于React Native版本号0.44.3写的.RN支持CSS中的布局属性,因此可以使用CSS布局属性,这里就不详细地讲解了,这篇文章的重点主要是讲述一下RN中的Flex布局. CSS属性布局 视图边框 何时使用? 想要设置自己周边有边框的时候 注意点:一定要设置边框宽度 borderBottomWidth number 底部边框宽度 borderLeftWidth number 左边框宽度 borderRightWidth number 右边框宽度 borderTopWidt

.Net Native 系列《三》:.NET Native部署测试方案及样例

之前一文<c++的性能, c#的产能?!鱼和熊掌可以兼得,.NET NATIVE初窥> 获得很多朋友支持和鼓励,也更让我坚定做这项技术的推广者,希望能让更多的朋友了解这项技术,于是先从官方信息的翻译开始做起. 此系列系小九的学堂原创翻译,翻译自微软官方开发向导,一共分为六个主题.本文是第三个主题:.NET Native部署测试及样例. 向导文链接:<C++的性能C#的产能?! - .Net Native 系列:开发向导> [小九的学堂,致力于以平凡的语言描述不平凡的技术.如要转载,

【REACT NATIVE 系列教程之十三】利用LISTVIEW与TEXTINPUT制作聊天/对话框&&获取组件实例常用的两种方式

本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/react-native/2346.html 本篇Himi来利用ListView和TextInput这两种组件实现对话.聊天框. 首先需要准备的有几点:(组件的学习就不赘述了,简单且官方有文档) 1. 学习下 ListView: 官方示例:http://reactnative.cn/docs/0.27/tutorial.html#content

菜鸟窝React Native 系列教程-1.移动端开发趋势与未来

菜鸟窝React Native 系列教程-1.移动端开发趋势与未来 课程持续更新中..... 我是RichardCao,现任新美大酒店旅游事业群的Android Developer.如果你也有兴趣录制RN视频,请加入下面QQ群找我. 下载地址:https://pan.baidu.com/s/1c1XmE56 密码:shhw 首发地址:菜鸟窝-ReactNative学习板块 交流QQ群:576089067 课程目录:菜鸟窝React Native 系列教程

【重磅】移动网络性能揭秘(下)--网络协议及性能提升实践

网络协议的性能 现在轮到我们实际上可以控制的东西了. 网络处理的性能与延迟时间的增加是不成比例的.这是由于大多数网络协议的内在操作是双向信息交换.本章的其余部分则侧重于理解为什么会产生这些信息交换以及如何减少甚至消除它们交换的频率. 图3:网络协议 传输控制协议 传输控制协议(TCP)是一种面向连接.基于ip的传输协议.TCP影响下的无差错双工通信信道对其他协议如HTTP或TLS来说都必不可少. TCP展示了许多我们需要尽量避免的双向通讯.这其中一些可以通过采用扩展协议如TCP Fast Ope

【REACT NATIVE 系列教程之二】创建自定义组件&&导入与使用示例

本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/react-native/2219.html 在上一篇  [REACT NATIVE 系列教程之一]触摸事件的两种形式与四种TOUCHABLE组件详解 中的最后介绍了如何使用Touchable的四种组件进行监听触摸事件.  那么紧接着我们利用Touchable来包装一个带图片的Button组件,且设计成可接受很多自定义参数. 一:创建我们自定义

SQLServer性能优化之 nolock,大幅提升数据库查询性能

公司数据库随着时间的增长,数据越来越多,查询速度也越来越慢.进数据库看了一下,几十万调的数据,查询起来确实很费时间. 要提升SQL的查询效能,一般来说大家会以建立索引(index)为第一考虑.其实除了index的建立之外,当我们在下SQL Command时,在语法中加一段WITH (NOLOCK)可以改善在线大量查询的环境中数据集被LOCK的现象藉此改善查询的效能. 不过有一点千万要注意的就是,WITH (NOLOCK)的SQL SELECT有可能会造成Dirty Read,就是读到无效的数据.

【REACT NATIVE 系列教程之十二】REACT NATIVE(JS/ES)与IOS(OBJECT-C)交互通信

一用到跨平台的引擎必然要有引擎与各平台原生进行交互通信的需要.那么Himi先讲解React Native与iOS之间的通信交互. 本篇主要分为两部分讲解:(关于其中讲解的OC语法等不介绍,不懂的请自行学习) 1. React Native 访问iOS 2. iOS访问React Native     一:React Native 访问iOS 1. 我们想要JS调用OC函数,就要实现一个"RCTBridgeModule"协议的Objective-C类 所以首先我们先创建一个oc新类,