• Stars
    star
    898
  • Rank 49,017 (Top 1.0 %)
  • Language
    C++
  • License
    The Unlicense
  • Created almost 5 years ago
  • Updated 3 months ago

Reviews

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

Repository Details

Clang build analysis tool using -ftime-trace

Clang Build Analyzer Build Status

Clang C/C++ build analysis tool when using Clang 9+ -ftime-trace. The -ftime-trace compiler flag (see blog post or Clang 9 release notes) can be useful to figure out what takes time during compilation of one source file. This tool helps to aggregate time trace reports from multiple compilations, and output "what took the most time" summary:

  • Which files are slowest to parse? i.e. spend time in compiler lexer/parser front-end
  • Which C++ templates took the most time to instantiate?
  • Which files are slowest to generate code for? i.e. spend time in compiler backend doing codegen and optimizations
  • Which functions are slowest to generate code for?
  • Which header files are included the most in the whole build, how much time is spent parsing them, and what are the include chains of them?

Usage

  1. Start the build capture: ClangBuildAnalyzer --start <artifacts_folder>
    This will write current timestamp in a ClangBuildAnalyzerSession.txt file under the given artifacts_folder. The artifacts folder is where the compiled object files (and time trace report files) are expected to be produced by your build.
  2. Do your build. Does not matter how; an IDE build, a makefile, a shell script, whatever. As long as it invokes Clang and passes -ftime-trace flag to the compiler (Clang 9.0 or later is required for this).
  3. Stop the build capture: ClangBuildAnalyzer --stop <artifacts_folder> <capture_file>
    This will load all Clang time trace compatible *.json files under the given artifacts_folder that were modified after --start step was done (Clang -ftime-trace produces one JSON file next to each object file), process them and store data file into a binary capture_file.
  4. Run the build analysis: ClangBuildAnalyzer --analyze <capture_file>
    This will read the capture_file produced by --stop step, calculate the slowest things and print them. If a ClangBuildAnalyzer.ini file exists in the current folder, it will be read to control how many of various things to print.

Aternatively, instead of doing --start and --stop steps, you can do ClangBuildAnalyzer --all <artifacts_folder> <capture_file> after your build; that will include all the compatible *.json files for analysis, no matter when they were produced.

Analysis Output

The analysis output will look something like this:

Analyzing build trace from 'artifacts/FullCapture.bin'...
**** Time summary:
Compilation (1761 times):
  Parsing (frontend):         5167.4 s
  Codegen & opts (backend):   7576.5 s

**** Files that took longest to parse (compiler frontend):
 19524 ms: artifacts/Modules_TLS_0.o
 18046 ms: artifacts/Editor_Src_4.o
 17026 ms: artifacts/Modules_Audio_Public_1.o
 16581 ms: artifacts/Runtime_Camera_4.o
 
**** Files that took longest to codegen (compiler backend):
145761 ms: artifacts/Modules_TLS_0.o
123048 ms: artifacts/Runtime_Core_Containers_1.o
 56975 ms: artifacts/Runtime_Testing_3.o
 52031 ms: artifacts/Tools_ShaderCompiler_1.o

**** Templates that took longest to instantiate:
 19006 ms: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::... (2665 times, avg 7 ms)
 12821 ms: std::__1::map<core::basic_string<char, core::StringStorageDefault<ch... (250 times, avg 51 ms)
  9142 ms: std::__1::map<core::basic_string<char, core::StringStorageDefault<ch... (432 times, avg 21 ms)
  8515 ms: std::__1::map<int, std::__1::pair<List<ListNode<Behaviour> > *, List... (392 times, avg 21 ms) 

**** Functions that took longest to compile:
  8710 ms: yyparse(glslang::TParseContext*) (External/ShaderCompilers/glslang/glslang/MachineIndependent/glslang_tab.cpp)
  4580 ms: LZ4HC_compress_generic_dictCtx (External/Compression/lz4/lz4hc_quarantined.c)
  4011 ms: sqlite3VdbeExec (External/sqlite/sqlite3.c)
  2737 ms: ProgressiveRuntimeManager::Update() (artifacts/Editor_Src_GI_Progressive_0.cpp)

**** Expensive headers:
136567 ms: /BuildEnvironment/MacOSX10.14.sdk/System/Library/Frameworks/Foundation.framework/Headers/Foundation.h (included 92 times, avg 1484 ms), included via:
  CocoaObjectImages.o AppKit.h  (2033 ms)
  OSXNativeWebViewWindowHelper.o OSXNativeWebViewWindowHelper.h AppKit.h  (2007 ms)
  RenderSurfaceMetal.o RenderSurfaceMetal.h MetalSupport.h Metal.h MTLTypes.h  (2003 ms)
  OSXWebViewWindowPrivate.o AppKit.h  (1959 ms)
  ...

112344 ms: Runtime/BaseClasses/BaseObject.h (included 729 times, avg 154 ms), included via:
  PairTests.cpp TestFixtures.h  (337 ms)
  Stacktrace.cpp MonoManager.h GameManager.h EditorExtension.h  (312 ms)
  PlayerPrefs.o PlayerSettings.h GameManager.h EditorExtension.h  (301 ms)
  Animation.cpp MaterialDescription.h  (299 ms)
  ...

103856 ms: Runtime/Threads/ReadWriteLock.h (included 478 times, avg 217 ms), included via:
  DownloadHandlerAssetBundle.cpp AssetBundleManager.h  (486 ms)
  LocalizationDatabase.cpp LocalizationDatabase.h LocalizationAsset.h StringTable.h  (439 ms)
  Runtime_BaseClasses_1.o MonoUtility.h ScriptingProfiler.h  (418 ms)
  ...

Granularity and amount of most expensive things (files, functions, templates, includes) that are reported can be controlled by having an ClangBuildAnalyzer.ini file in the working directory. Take a look at ClangBuildAnalyzer.ini for an example.

Building it

  • Windows: Visual Studio 2019 solution at projects/vs2019/ClangBuildAnalyzer.sln.
  • Mac: Xcode 10.x project at projects/xcode/ClangBuildAnalyzer.xcodeproj.
  • Linux: Makefile for gcc (tested with 7.4), build with make -f projects/make/Makefile.
  • You can also use provided CMakeLists.txt, if you want to build using CMake.

Limitations

  • Does not capture anything related to linking or LTO right now.
  • May or may not scale to huge builds (I haven't tried on something ginormous like a Chrome build). However I have tried it on Unity editor build and it was not terrible.

License

License for the Clang Build Analyzer itself is Unlicense, i.e. public domain. However, the source code includes several external library source files (all under src/external), each with their own license:

More Repositories

1

glsl-optimizer

GLSL optimizer based on Mesa's GLSL compiler. Used to be used in Unity for mobile shader optimization.
C++
1,701
star
2

UnityGaussianSplatting

Toy Gaussian Splatting visualization in Unity
C#
1,674
star
3

ToyPathTracer

Toy path tracer for my own learning purposes (CPU/GPU, C++/C#, Win/Mac/Wasm, DX11/Metal, also Unity)
C++
1,040
star
4

hlsl2glslfork

HLSL to GLSL language translator based on ATI's HLSL2GLSL. Used in Unity.
C++
548
star
5

dod-playground

Sample OOP/ECS/DOD project (C++) for an internal Unity lecture in 2018
C++
362
star
6

smol-v

SMOL-V: like Vulkan/Khronos SPIR-V, but smaller.
C++
285
star
7

sizer

Win32/64 executable size reporting
C++
243
star
8

ToyMeshPathTracer

Toy Mesh Path Tracer that I used as a base for job interview tasks
C++
118
star
9

UnityGPUTexCompression

How to do DXT/BCn texture compression in Unity using compute shaders
C#
62
star
10

gamedev-emojis

128x128 sized icons of various game development things
Python
59
star
11

miniexr

Small code to write OpenEXR images
C++
56
star
12

UnityStbEasyFont

C#
46
star
13

HashFunctionsTest

Little test of various hash functions
C++
46
star
14

header_hero

Fork of Bitsquid's Header Hero tool
C#
36
star
15

BlackHoleDemo

C#
26
star
16

markdeep-docs-style

Documentation CSS style for Markdeep
CSS
25
star
17

smol-compute

A tiny library for launching compute shaders on D3D11, Metal and Vulkan
C
24
star
18

dingus

engine used in some nesnausk! demos
C++
23
star
19

glsl-load-speed

Quick test of GLSL shader loading speed
C++
17
star
20

bcn_decoder_tester

Testing various BCn texture format decoding libraries
C++
16
star
21

jobtask2019-trimesh-tracer

A programming task for job interviews I did in 2019 Q2
C++
16
star
22

obj_parse_tester

Comparing various C++ OBJ parsing libraries
C
16
star
23

bc7e-on-gpu

An attempt to port BC7E texture compressor to a GPU compute shader
HLSL
14
star
24

float_compr_tester

Testing various libraries/approaches for compressing floating point data
HTML
10
star
25

aras-p.hugo

This is just my website, content & Hugo bits
HTML
9
star
26

sprint-fuuu

C++
6
star
27

oklab_gradient_test

C++
5
star
28

sideshooter50

A game in 50 lines of code
4
star
29

twod_coverage_raster

Super simplistic 2D triangle coverage rasterizer
C
4
star
30

SoftRenderBlogProject

C
3
star
31

trianglomator

C#
3
star
32

dod-lecture-2018

C#
3
star
33

ggj19-rumba

A small game during Global Game Jam 2019
C#
3
star
34

filteression

C++
2
star
35

hgext

misc hg extension stuff
Python
1
star
36

website

PHP
1
star
37

image-formats-testbed-hack

C++
1
star