Want to take your software engineering career to the next level? Join the mailing list for career tips & advice Click here

SwiftCompilationPerformanceReporter

Generate automated reports for slow Swift compilation paths in specific targets

Subscribe to updates I use SwiftCompilationPerformanceReporter


Statistics on SwiftCompilationPerformanceReporter

Number of watchers on Github 147
Number of open issues 0
Average time to close an issue 20 days
Main language Swift
Average time to merge a PR 2 days
Open pull requests 0+
Closed pull requests 0+
Last commit about 4 years ago
Repo Created over 4 years ago
Repo Last Updated almost 3 years ago
Size 28 KB
Organization / Authortumblr
Contributors1
Page Updated
Do you use SwiftCompilationPerformanceReporter? Leave a review!
View SwiftCompilationPerformanceReporter activity
View on github
Book a Mock Interview With Me (Silicon Valley Engineering Leader, 100s of interviews conducted)
Software engineers: It's time to get promoted. Starting NOW! Subscribe to my mailing list and I will equip you with tools, tips and actionable advice to grow in your career.
Evaluating SwiftCompilationPerformanceReporter for your project? Score Explanation
Commits Score (?)
Issues & PR Score (?)

SwiftCompilationPerformanceReporter

Inspired by Brian and Bryan's prior work, we've decided to develop a Swift Package and script to generate automated reports for slow Swift compilation paths in specific targets!

SwiftCompilationPerformanceReporter (nicknamed SwiftCPR) can be configured to build a specific target, output raw debug times to a specific location, and clean those logs to rank the slowest parts to compile.

Requirements

Configuration

SwiftCompilationPerformanceReporter can be configured via the config.json file. Below is a description of the options available and a sample configuration:

{
    // Note: either a project or workspace file can be specified, _but not both_
    "workspacePath": "/Users/jasdev/orangina/Orangina.xcworkspace",
    "projectPath": "/Users/jasdev/orangina/Orangina.xcodeproj",

    "scheme": "Orangina",
    "buildOutputDirectory": "/Users/jasdev/Desktop/CompilationLogs/",
    "reportOutputDirectory": "/Users/jasdev/Desktop/ProcessedLogs/",
    "limit": 10
}

workspacePath: The absolute path to the workspace file to use.

projectPath: The absolute path to the project file to use.

scheme: The scheme to use

buildOutputDirectory: The directory to store the raw build output files with Swift compilation times.

reportOutputDirectory: The directory to store the processed logs derived from the raw log output.

limit: The number of compilation paths to include in the final results (i.e. the slowest limit paths that compiler handled).

Installation

  • Simply clone this repository on the machine that will be generating these reports.
  • Run swift build in the root directory
  • Make sure all directories used in config.json are set properly and exist.
  • If your desired scheme is built with a pre-3.x version of Swift, you'll want to xcode-select back to a stable version (i.e. sudo xcode-select -s /Applications/Xcode.app)
  • To kick off the script, run .build/debug/SwiftCompilationPerformanceReporter in the root directory!
  • If there are any errors, the script will output them.
  • The processed logs will be outputted as timestamped files in reportOutputDirectory.

Output

The processed logs will be outputted as a tab separated file with 3 columns after the first line (which holds the total build time). All time units are in seconds.

[Build Time]\t[Path and Line]\t[Detailed Description]

Sample output file:

Total build time: 1214.91016298532
17.0409 /Users/jasdev/orangina/Classes/PerformanceLoggingEvent.swift:278:37 final get {}
7.9331  /Users/jasdev/orangina/Components/ComposeUI/Classes/Election/LeaderboardTableView.swift:71:17   @objc final class func totalHeight(candidates: UInt, allowsLeaderboard: Bool) -> CGFloat
6.2961  /Users/jasdev/orangina/Classes/UniversalLink.swift:127:25   private final class func dictionaryOfAppArgumentsFromQueryString(string: String) -> [NSObject : AnyObject]?
4.2116  /Users/jasdev/orangina/Classes/ActivityViewController.swift:56:22   final get {}
SwiftCompilationPerformanceReporter list of languages used
Other projects in Swift
Powered by Autocode - Instant Webhooks, Scripts and APIs
Autocode logo wordmark