• Stars
    star
    4,154
  • Rank 10,424 (Top 0.3 %)
  • Language
    C#
  • License
    MIT License
  • Created over 9 years ago
  • Updated about 1 month ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

PerfView is a CPU and memory performance-analysis tool

PerfView Overview

PerfView is a free performance-analysis tool that helps isolate CPU and memory-related performance issues. It is a Windows tool, but it also has some support for analyzing data collected on Linux machines. It works for a wide variety of scenarios, but has a number of special features for investigating performance issues in code written for the .NET runtime.

If you are unfamiliar with PerfView, there are PerfView video tutorials. Also, Vance Morrison's blog gives overview and getting started information.

Getting PerfView

Please see the PerfView Download Page for the link and instructions for downloading the current version of PerfView.

Are you here about the TraceEvent Library?

PerfView is built on a library called Microsoft.Diagnostics.Tracing.TraceEvent, that knows how to both collect and parse Event Tracing for Windows (ETW) data. Thus if there is any information that PerfView collects and processes that you would like to manipulate yourself programmatically, you would probably be interested in the TraceEvent Library Documentation

Learning about PerfView

The PerfView User's Guide is part of the application itself. In addition, you can click the Users Guide link to see the GitHub HTML Source File rendered in your browser. You can also simply download PerfView using the instructions above and select the Help -> User's Guide menu item.

Asking Questions / Reporting Bugs

When you have question about PerfView, your first reaction should be to search the Users Guide (Help -> User's Guide) and see if you can find the answer already. If that does not work you can ask a question by creating a new PerfView Issue. State your question succinctly in the title, and if necessary give details in the body of the issue, there is a issue tag called 'question' that you should use as well that marks your issue as a question rather than some bug report. If the question is specific to a particular trace (*.ETL.ZIP file) you can drag that file onto the issue and it will be downloaded. This allows those watching for issues to reproduce your environment and give much more detailed and useful answers.

Note that once you have your question answered, if the issue is likely to be common, you should strongly consider updating the documentation to include the information. The documentation is pretty much just one file https://github.com/Microsoft/perfview/blob/main/src/PerfView/SupportFiles/UsersGuide.htm. You will need to clone the repository and create a pull request (see OpenSourceGitWorkflow for instructions for setting up and creating a pull request.

Reporting bugs works pretty much the same way as asking a question. It is very likely that you will want to include the *.ETL.ZIP file needed to reproduce the problem as well as any steps and the resulting undesirable behavior.

Building PerfView Yourself

If you just want to do a performance investigation, you don't need to build PerfView yourself. Just use the one from the PerfView Download Page. However if you want new features or just want to contribute to PerfView to make it better (see issues for things people want) you can do that by following the rest of these instructions.

Tools Needed to Build PerfView

The only tools you need to build PerfView are Visual Studio 2022 and the .NET Core SDK. The Visual Studio 2022 Community Edition can be downloaded for free and, along with the .NET Core SDK, has everything you need to fetch PerfView from GitHub, build and test it. We expect you to download Visual Studio 2022 Community Edition if you don't already have Visual Studio 2022.

PerfView is mostly C# code, however there is a small amount of C++ code to implement some advanced features of PerfView (The ETWCLrProfiler dlls that allow PerfView to intercept the .NET Method calls; see .NET Call in the Collect dialog).
If you downloaded the Visual Studio 2022 Community Edition, it does not install the C++ compilation tools by default and it also does not include the Windows 10 SDK by default (we build PerfView so it can run on Win8 as well as Win10). Thus when you install Visual Studio 2022 check the 'Desktop Development with C++' option and then look the right pane to see the optional sub-components, and make sure the Windows 10 SDK is also checked (it typically is not). Installing the latest version should be OK. If you have already installed Visual Studio 2022, you can add these options by going to Control Panel -> Programs and Features -> Visual Studio 2022, and click 'Modify'. This will get you to the place where you can selecte the Desktop Development with C++ and the Windows 10 SDK. If you get any errors compiling the ETWClrProfiler* dlls, it is likely associated with getting this Win 10.0 SDK. See the troubleshooting sections below for more if you need it.

The .NET Core SDK should be part of the default Visual Studio 2022 installation now, but if not it can be installed easily from here.

Cloning the PerfView GitHub Repository.

The first step in getting started with the PerfView source code is to clone the PerfView GitHub repository. If you are already familiar with how GIT, GitHub, and Visual Studio 2022 GIT support works, then you can skip this section. However, if not, the Setting up a Local GitHub repository with Visual Studio 2022 document will lead you through the basics of doing this. All it assumes is that you have Visual Studio 2022 installed.

How to Build and Debug PerfView

PerfView is developed in Visual Studio 2022 using features through C# 6.

  • The solution file is PerfView.sln. Opening this file in Visual Studio (or double clicking on it in the Windows Explorer) and selecting Build -> Build Solution, will build it. You can also build the non-debug version from the command line using msbuild or the build.cmd file at the base of the repository. The build follows standard Visual Studio conventions, and the resulting PerfView.exe file ends up in src/PerfView/bin/BuildType/PerfView.exe. You need only deploy this one EXE to use it.

  • The solution consists of 11 projects, representing support DLLs and the main EXE. To run PerfView in the debugger you need to make sure that the 'Startup Project' is set to the 'PerfView' project so that it launches the main EXE. If the PerfView project in the Solution Explorer (on the right) is not bold, right click on the PerfView project and select 'Set as Startup Project'. After doing this 'Start Debugging' (F5) should work. (It is annoying that this is not part of the .sln file...).

Deploying your new version of Perfview

You will want to deploy the 'Release' rather than the 'Debug' version of PerfView. Thus, first set your build configuration to 'Release' (Text window in the top toolbar, or right click on the .SLN file -> Configuration Manager -> Active Solution Configuration). Next build (Build -> Build Solution (Ctrl-Shift-B)). The result will be that in the src\perfView\bin\net462\Release directory there will be among other things a PerfView.exe. This one file is all you need to deploy. Simply copy it to where you wish to deploy the app.

Information for build troubleshooting.

  • One of the unusual things about PerfView is that it incorporates its support DLLs into the EXE itself, and these get unpacked on first launch. This means that there are tricky dependencies in the build that are not typical. You will see errors that certain DLLs can't be found if there were build problems earlier in the build. Typically you can fix this simply by doing a normal (non-clean) build, since the missing file will be present from the last compilation. If this does not fix things, see if the DLL being looked for actually exists (if it does, then rebuilding should fix it). It can make sense to go down the projects one by one and build them individually to see which one fails 'first'.

  • Another unusual thing about PerfView is that it includes an extension mechanism complete with samples. This extensions mechanism is the 'Global' project (called that because it is the Global Extension whose commands don't have an explicit 'scope') and needs to refer to PerfView to resolve some of its references. Thus you will get many 'not found' issues in the 'Global' project. These can be ignored until you get every other part of the build working.

  • One of the invariants of the repo is that if you are running Visual Studio 2022 and you simply sync and build the PerfView.sln file, it is supposed to 'just work'. If that does not happen, and the advice above does not help, then we need to either fix the repo or update the advice above. Thus it is reasonable to open a GitHub issue. If you do this, the goal is to fix the problem, which means you have to put enough information into the issue to do that. This includes exactly what you tried, and what the error messages were.

  • You can also build PerfView from the command line (but you still need Visual Studio 2022 installed). It is a two step process. First you must restore all the needed nuget packages, then you do the build itself. To do this:

    1. Open a developer command prompt. You can do this by hitting the windows key (by the space bar) and type 'Developer command prompt'. You should see a entry for this that you can select (if Visual Studio 2022 is installed).
    2. Change directory to the base of your PerfView source tree (where PerfView.sln lives).
    3. Restore the nuget packages by typing the command 'msbuild /t:restore'
    4. Build perfView by typing the command 'msbuild'
  • If you get an error "MSB8036: The Windows SDK version 10.0.17763.0 was not found", Or you get a 'assert.h' not found error, or frankly any error associated with building the ETWClrProfiler dlls, you should make sure that you have the Windows 10.0.17763.0 SDK installed. Unfortunately this library tends not to be installed with Visual Studio anymore unless you ask for it explicitly. To fix it

    • windows-Key -> type Control panel -> Programs and Features, and right click on your VS2019 and select 'Modify'. Then look under the C++ Desktop Development and check that the Windows SDK 10.0.17763.0 option is selected. If not, select it and have the setup install this. Then try building PerfView again.

Running Tests

PerfView has a number of *.Test projects that have automated tests. They can be run in Visual Studio by selecting the Test -> Run -> All Tests menu item. For the most thorough results (and certainly if you intend to submit changes) you need to run these tests with a Debug build of the product (see the text window in the top toolbar, it says 'Debug' or 'Release'). If tests fail you can right click on the failed test and select the 'Debug' context menu item to run the test under the debugger to figure out what went wrong.

Check in testing and code coverage statistica

This repository uses AppVeyor and Azure DevOps to automatically build and test pull requests, which allows the community to easily view build results. Code coverage is provided by codecov.io. The build and coverage status reflected here is the AppVeyor and Azure DevOps build status of the main branch.

Build Status

Build status

codecov

⚠️ Builds produced by AppVeyor and Azure DevOps CI are not considered official builds of PerfView, and are not signed or otherwise validated for safety or security in any way. This build integration is provided as a convenience for community participants, but is not endorsed by Microsoft nor is it considered an official release channel in any way. For information about official builds, see the PerfView Download Page page.

Contributing to PerfView

You can get a lot of value out of the source code base simply by being able to build the code yourself, debug through it or make a local, specialized feature, but the real power of open source software happens when you contribute back to the shared code base and thus help the community as a whole. While we encourage this it requires significantly more effort on your part. If you are interested in stepping up, see the PerfView Contribution Guide and PerfView Coding Standards before you start.

Code Organization

The code is broken into several main sections:

  • PerfView - GUI part of the application
    • StackViewer - GUI code for any view with the 'stacks' suffix
    • EventViewer - GUI code for the 'events' view window
    • Dialogs - GUI code for a variety of small dialog boxes (although the CollectingDialog is reasonably complex)
    • Memory - Contains code for memory investigations, in particular it defines 'Graph' and 'MemoryGraph' which are used to display node-arc graphs (e.g. GC heaps)
  • TraceEvent - Library that understands how to decode Event Tracing for Windows (ETW) which is used to actually collect the data for many investigations
  • MainWindow - GUI code for the window that is initially launched (lets you select files or collect new data)
  • ETWClrProfiler* - There are two projects that build the same source either 32 or 64 bit. This is (the only) native code project in PerfView, and implements the CLR Profiler API and emits ETW events. It is used to trace object allocation stacks and .NET method calls.
  • HeapDump* There are 32 and 64 bit versions of this project. These make standalone executables that can dump the GC heap using Microsoft.Diagnostics.Runtime APIs. This allows getting heap dumps from debugger process dumps.
  • Global - An example of using PerfView's extensibility mechanism
  • CSVReader - old code that lets PerfView read .ETL.CSV files generated by XPERF (probably will delete)
  • Zip - a clone of System.IO.Compression.dll so that PerfView can run on pre V4.5 runtimes (probably will delete)

Other Documentation

These docs are for specialized scenarios

  • Updating SupportFiles PerfView uses some binary files that it does not build itself. We created two nuget packages to hold these. This document tells you how to update this nuget package when these files need to be updated. Very few people should care about these instructions.

  • Internal Docs This is documentation that is only useful for internal Microsoft users. By design the link will not work for most people.

More Repositories

1

vscode

Visual Studio Code
TypeScript
163,565
star
2

PowerToys

Windows system utilities to maximize productivity
C#
110,602
star
3

TypeScript

TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
TypeScript
100,730
star
4

terminal

The new Windows Terminal and the original Windows console host, all in the same place!
C++
94,835
star
5

Web-Dev-For-Beginners

24 Lessons, 12 Weeks, Get Started as a Web Developer
JavaScript
83,418
star
6

ML-For-Beginners

12 weeks, 26 lessons, 52 quizzes, classic Machine Learning for all
HTML
69,631
star
7

generative-ai-for-beginners

21 Lessons, Get Started Building with Generative AI 🔗 https://microsoft.github.io/generative-ai-for-beginners/
Jupyter Notebook
64,519
star
8

playwright

Playwright is a framework for Web Testing and Automation. It allows testing Chromium, Firefox and WebKit with a single API.
TypeScript
64,013
star
9

monaco-editor

A browser based code editor
JavaScript
35,437
star
10

DeepSpeed

DeepSpeed is a deep learning optimization library that makes distributed training and inference easy, efficient, and effective.
Python
35,130
star
11

AI-For-Beginners

12 Weeks, 24 Lessons, AI for All!
Jupyter Notebook
34,704
star
12

autogen

A programming framework for agentic AI 🤖
Jupyter Notebook
32,470
star
13

MS-DOS

The original sources of MS-DOS 1.25, 2.0, and 4.0 for reference purposes
Assembly
30,714
star
14

Data-Science-For-Beginners

10 Weeks, 20 Lessons, Data Science for All!
Jupyter Notebook
28,136
star
15

calculator

Windows Calculator: A simple yet powerful calculator that ships with Windows
C++
27,371
star
16

cascadia-code

This is a fun, new monospaced font that includes programming ligatures and is designed to enhance the modern look and feel of the Windows Terminal.
Python
25,726
star
17

JARVIS

JARVIS, a system to connect LLMs with ML community. Paper: https://arxiv.org/pdf/2303.17580.pdf
Python
23,519
star
18

api-guidelines

Microsoft REST API Guidelines
22,661
star
19

winget-cli

WinGet is the Windows Package Manager. This project includes a CLI (Command Line Interface), PowerShell modules, and a COM (Component Object Model) API (Application Programming Interface).
C++
20,495
star
20

unilm

Large-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities
Python
19,889
star
21

vcpkg

C++ Library Manager for Windows, Linux, and MacOS
CMake
19,600
star
22

fluentui

Fluent UI web represents a collection of utilities, React components, and web components for building web applications.
TypeScript
18,419
star
23

semantic-kernel

Integrate cutting-edge LLM technology quickly and easily into your apps
C#
17,792
star
24

graphrag

A modular graph-based Retrieval-Augmented Generation (RAG) system
Python
17,750
star
25

CNTK

Microsoft Cognitive Toolkit (CNTK), an open source deep-learning toolkit
C++
17,412
star
26

WSL

Issues found on WSL
PowerShell
17,372
star
27

LightGBM

A fast, distributed, high performance gradient boosting (GBT, GBDT, GBRT, GBM or MART) framework based on decision tree algorithms, used for ranking, classification and many other machine learning tasks.
C++
16,470
star
28

AirSim

Open source simulator for autonomous vehicles built on Unreal Engine / Unity, from Microsoft AI & Research
C++
16,327
star
29

react-native-windows

A framework for building native Windows apps with React.
C++
16,310
star
30

recommenders

Best Practices on Recommendation Systems
Python
16,075
star
31

IoT-For-Beginners

12 Weeks, 24 Lessons, IoT for All!
C++
15,360
star
32

qlib

Qlib is an AI-oriented quantitative investment platform that aims to realize the potential, empower research, and create value using AI technologies in quantitative investment, from exploring ideas to implementing productions. Qlib supports diverse machine learning modeling paradigms. including supervised learning, market dynamics modeling, and RL.
Python
15,308
star
33

dotnet

This repo is the official home of .NET on GitHub. It's a great starting point to find many .NET OSS projects from Microsoft and the community, including many that are part of the .NET Foundation.
HTML
14,370
star
34

Bringing-Old-Photos-Back-to-Life

Bringing Old Photo Back to Life (CVPR 2020 oral)
Python
14,132
star
35

ai-edu

AI education materials for Chinese students, teachers and IT professionals.
HTML
13,485
star
36

pyright

Static Type Checker for Python
Python
13,195
star
37

nni

An open source AutoML toolkit for automate machine learning lifecycle, including feature engineering, neural architecture search, model compression and hyper-parameter tuning.
Python
13,084
star
38

guidance

A guidance language for controlling large language models.
Jupyter Notebook
11,777
star
39

TypeScript-Node-Starter

A reference example for TypeScript and Node with a detailed README describing how to use the two together.
SCSS
11,314
star
40

Swin-Transformer

This is an official implementation for "Swin Transformer: Hierarchical Vision Transformer using Shifted Windows".
Python
11,187
star
41

TypeScript-React-Starter

A starter template for TypeScript and React with a detailed README describing how to use the two together.
TypeScript
11,081
star
42

frontend-bootcamp

Frontend Workshop from HTML/CSS/JS to TypeScript/React/Redux
TypeScript
10,807
star
43

mimalloc

mimalloc is a compact general purpose allocator with excellent performance.
C
10,532
star
44

windows-rs

Rust for Windows
Rust
10,411
star
45

wslg

Enabling the Windows Subsystem for Linux to include support for Wayland and X server related scenarios
C++
10,165
star
46

language-server-protocol

Defines a common protocol for language servers.
HTML
10,093
star
47

sql-server-samples

Azure Data SQL Samples - Official Microsoft GitHub Repository containing code samples for SQL Server, Azure SQL, Azure Synapse, and Azure SQL Edge
9,950
star
48

onnxruntime

ONNX Runtime: cross-platform, high performance ML inferencing and training accelerator
C++
9,837
star
49

fast

The adaptive interface system for modern web experiences.
TypeScript
9,271
star
50

computervision-recipes

Best Practices, code samples, and documentation for Computer Vision.
Jupyter Notebook
9,264
star
51

napajs

Napa.js: a multi-threaded JavaScript runtime
C++
9,256
star
52

Windows-universal-samples

API samples for the Universal Windows Platform.
JavaScript
9,253
star
53

LoRA

Code for loralib, an implementation of "LoRA: Low-Rank Adaptation of Large Language Models"
Python
9,145
star
54

fluentui-emoji

A collection of familiar, friendly, and modern emoji from Microsoft
Python
9,068
star
55

vscode-tips-and-tricks

Collection of helpful tips and tricks for VS Code.
9,038
star
56

playwright-python

Python version of the Playwright testing and automation library.
Python
8,990
star
57

STL

MSVC's implementation of the C++ Standard Library.
C++
8,978
star
58

react-native-code-push

React Native module for CodePush
C
8,643
star
59

vscode-extension-samples

Sample code illustrating the VS Code extension API.
TypeScript
8,628
star
60

inshellisense

IDE style command line auto complete
TypeScript
8,402
star
61

reverse-proxy

A toolkit for developing high-performance HTTP reverse proxy applications.
C#
8,398
star
62

reactxp

Library for cross-platform app development.
TypeScript
8,289
star
63

WSL2-Linux-Kernel

The source for the Linux kernel used in Windows Subsystem for Linux 2 (WSL2)
C
8,037
star
64

ailab

Experience, Learn and Code the latest breakthrough innovations with Microsoft AI
C#
7,699
star
65

c9-python-getting-started

Sample code for Channel 9 Python for Beginners course
Jupyter Notebook
7,642
star
66

UFO

A UI-Focused Agent for Windows OS Interaction.
Python
7,633
star
67

cpprestsdk

The C++ REST SDK is a Microsoft project for cloud-based client-server communication in native code using a modern asynchronous C++ API design. This project aims to help C++ developers connect to and interact with services.
C++
7,573
star
68

botframework-sdk

Bot Framework provides the most comprehensive experience for building conversation applications.
JavaScript
7,484
star
69

azuredatastudio

Azure Data Studio is a data management and development tool with connectivity to popular cloud and on-premises databases. Azure Data Studio supports Windows, macOS, and Linux, with immediate capability to connect to Azure SQL and SQL Server. Browse the extension library for more database support options including MySQL, PostreSQL, and MongoDB.
TypeScript
7,182
star
70

winget-pkgs

The Microsoft community Windows Package Manager manifest repository
6,981
star
71

Windows-driver-samples

This repo contains driver samples prepared for use with Microsoft Visual Studio and the Windows Driver Kit (WDK). It contains both Universal Windows Driver and desktop-only driver samples.
C
6,924
star
72

winfile

Original Windows File Manager (winfile) with enhancements
C
6,437
star
73

nlp-recipes

Natural Language Processing Best Practices & Examples
Python
6,379
star
74

WinObjC

Objective-C for Windows
C
6,241
star
75

SandDance

Visually explore, understand, and present your data.
TypeScript
6,091
star
76

VFSForGit

Virtual File System for Git: Enable Git at Enterprise Scale
C#
5,979
star
77

GSL

Guidelines Support Library
C++
5,957
star
78

MixedRealityToolkit-Unity

This repository is for the legacy Mixed Reality Toolkit (MRTK) v2. For the latest version of the MRTK please visit https://github.com/MixedRealityToolkit/MixedRealityToolkit-Unity
C#
5,943
star
79

fluentui-system-icons

Fluent System Icons are a collection of familiar, friendly and modern icons from Microsoft.
HTML
5,934
star
80

vscode-go

An extension for VS Code which provides support for the Go language. We have moved to https://github.com/golang/vscode-go
TypeScript
5,932
star
81

microsoft-ui-xaml

Windows UI Library: the latest Windows 10 native controls and Fluent styles for your applications
5,861
star
82

vscode-recipes

JavaScript
5,859
star
83

rushstack

Monorepo for tools developed by the Rush Stack community
TypeScript
5,840
star
84

MMdnn

MMdnn is a set of tools to help users inter-operate among different deep learning frameworks. E.g. model conversion and visualization. Convert models between Caffe, Keras, MXNet, Tensorflow, CNTK, PyTorch Onnx and CoreML.
Python
5,782
star
85

vscode-docs

Public documentation for Visual Studio Code
Markdown
5,650
star
86

ethr

Ethr is a Comprehensive Network Measurement Tool for TCP, UDP & ICMP.
Go
5,642
star
87

FASTER

Fast persistent recoverable log and key-value store + cache, in C# and C++.
C#
5,630
star
88

vscode-cpptools

Official repository for the Microsoft C/C++ extension for VS Code.
TypeScript
5,501
star
89

DirectX-Graphics-Samples

This repo contains the DirectX Graphics samples that demonstrate how to build graphics intensive applications on Windows.
C++
5,440
star
90

promptbase

All things prompt engineering
Python
5,367
star
91

BosqueLanguage

The Bosque programming language is an experiment in regularized design for a machine assisted rapid and reliable software development lifecycle.
TypeScript
5,282
star
92

TaskWeaver

A code-first agent framework for seamlessly planning and executing data analytics tasks.
Python
5,258
star
93

Detours

Detours is a software package for monitoring and instrumenting API calls on Windows. It is distributed in source code form.
C++
5,139
star
94

tsyringe

Lightweight dependency injection container for JavaScript/TypeScript
TypeScript
5,104
star
95

DeepSpeedExamples

Example models using DeepSpeed
Python
5,092
star
96

SynapseML

Simple and Distributed Machine Learning
Scala
5,041
star
97

Windows-classic-samples

This repo contains samples that demonstrate the API used in Windows classic desktop applications.
5,040
star
98

sudo

It's sudo, for Windows
Rust
4,998
star
99

TypeScript-Handbook

Deprecated, please use the TypeScript-Website repo instead
JavaScript
4,883
star
100

vscode-dev-containers

NOTE: Most of the contents of this repository have been migrated to the new devcontainers GitHub org (https://github.com/devcontainers). See https://github.com/devcontainers/template-starter and https://github.com/devcontainers/feature-starter for information on creating your own!
Shell
4,713
star