> On 17 Nov 2017, at 01:27, Graydon Hoare via swift-dev <swift-dev@swift.org> 
> wrote:
> 
> Hi,
> 
> This is just an update on some work that's been ongoing in the past several 
> months related to tracking and improving Swift compilation performance. I've 
> been helping coordinate some of that work: documenting what's known about 
> compilation performance patterns and diagnostic machinery, increasing 
> visibility and process controls around compilation performance, and also 
> helping making some changes directly to the compiler.
> 
> I wanted to post here to make sure everyone's aware of what's currently going 
> on, as well as solicit feedback on priorities and ways to help others 
> interested in the topic.
> 
> Here's a bit of an overview of recent activities:
> 
> 
> Compilation-performance documentation
> =====================================
> 
> There's a somewhat lengthy document I wrote up during the summer that 
> explains what's currently known about how compilation performance varies in 
> the Swift compiler, what the causes of that variation (and existing cost 
> centers) are, how things are known to sometimes go wrong, which compiler 
> options exist to help understand the compiler's behaviour, and which 
> auxiliary tools, scripts and processes can help diagnose and improve 
> compilation performance.
> 
> It's stored in the repository 
> (https://github.com/apple/swift/blob/master/docs/CompilerPerformance.md) and 
> I'll be trying to keep it up to date as things change, but it's a good 
> initial orientation read when approaching the topic.
> 
> 
> Pull request (PR) compilation-performance testing
> =================================================
> 
> More interactively: a new form of PR testing (documented in 
> https://github.com/apple/swift/blob/master/docs/ContinuousIntegration.md#testing-compiler-performance)
>  has been added in recent months that committers can trigger with:
> 
>  @swift-ci please smoke test compiler performance
> 
> or
> 
>  @swift-ci please test compiler performance
> 
> The latter takes quite a long time, and if you are just curious to see if a 
> change helps or hurts compilation performance, the former is usually totally 
> adequate.
> 
> Output from these commands looks like this:
> 
>  https://github.com/apple/swift/pull/12843#issuecomment-345042338
> 
> And it displays a summary of output binary-size and compile-time changes 
> between your pull request and the branch you're committing to, as well as 
> changes to a set of compiler statistics tracking interesting causes of work.
> 
> These CI-level reports are based on compiling and measuring the source 
> compatibility testsuite (kept at 
> https://github.com/apple/swift-source-compat-suite). The "smoke" CI test, 
> which is usually sufficiently representative to catch regressions, measures 
> counters and timers for 3 projects in the source compatibility suite 
> (currently Alamofire, Kingfisher and ReactiveCocoa); the "full" test measures 
> the whole suite.
> 
> 
> Measurements in general
> =======================
> 
> The measurements taken by the CI tests above are emitted by the compiler 
> using a mode introduced earlier in the year: -stats-output-dir. Briefly: this 
> mode emits a collection of .json files summarizing all available statistics 
> and timers in a given compiler (the exact set changes depending on whether 
> the compiler is built with asserts). One .json file is written per frontend 
> or driver process in a compilation, so this permits post-execution analysis 
> by a variety of tools. One such tool (swift/utils/process-stats-dir.py, see 
> https://github.com/apple/swift/blob/master/docs/CompilerPerformance.md#post-processing-tools-for-diagnostics)
>  is usable both for batch analysis (the CI job uses it) or manually for 
> interpreting the performance impact of a change on a developer's workstation. 
> It is also, of course, usable in regression tests; a handful of tests now 
> directly measure performance counters using it.
> 
> 
> Scale testing
> =============
> 
> In addition to testing the absolute values of counters in the compiler, 
> there's a bit of test infrastructure that uses those counters in a more 
> abstract way, called "scale tests" (driven by utils/scale-test.py). This 
> approach measures the relationship between linear changes to the scale of a 
> synthetic input (say: increases to the number of classes in a project) and 
> changes to the amount of work different counters in the compiler do. This is 
> explained in more detail in 
> https://github.com/apple/swift/blob/master/docs/CompilerPerformance.md#scale-test,
>  but briefly: this allows writing tests that are insensitive to the exact 
> values of counters, but that check that counters have certain desirable 
> relationships (eg. linear or sub-linear) to the scale of inputs, rather than 
> undesirable relationships (quadratic or worse).
> 
> 
> Reducing quadratic costs
> ========================
> 
> One area of work that the scale-tests have highlighted are those parts of 
> early semantic-analysis that work on "all declarations in a module", and that 
> thereby risk doing work that's quadratic in the number of files, when running 
> a debug build. The compiler was designed to avoid this sort of quadratic work 
> by being lazy about its analysis, but measurements suggest it's not always 
> working as well as intended. Based on the belief that these cost centers are 
> responsible for cases where (non-WMO) debug builds run slower than the 
> unsupported (but widely practiced) "WMO debug builds", several people are 
> focusing attention on reducing these costs, in two ways:
> 
> 1. Making each frontend do closer-to-constant work, by loading, importing and 
> validating declaration members more lazily. For example, some work I've 
> recently been doing on name lookup (eg. 
> https://github.com/apple/swift/pull/12669), and some other work Slava 
> Pestov's been doing on extension binding 
> (https://github.com/apple/swift/pull/12855) and member validation 
> (https://github.com/apple/swift/pull/12942). Not all of this work is landed 
> or enabled yet, but it shows some promise, and each piece should magnify the 
> effects of the others.
> 
> 2. Reorganizing the strategy by which the driver runs frontend processes, to 
> permit batching semantic work in non-WMO builds. This is work Jordan Rose 
> outlined in September 
> (https://lists.swift.org/pipermail/swift-dev/Week-of-Mon-20170925/005439.html)
>  and David Ungar started on in October 
> (https://github.com/apple/swift/pull/12373); it's still early on but the hope 
> is that it may reduce the tradeoff between WMO and non-WMO debug builds, 
> gaining some of the best of both models and ideally removing the need for 
> users to fiddle with obscure build settings.
> 
> 
> Improving incremental mode
> ==========================
> 
> Another area that could use work is the incremental compilation logic in the 
> driver -- that is, reducing the number of times a file is rebuilt when it 
> "doesn't need to be" -- and some of the documentation and driver-level 
> counters mentioned above provide insight into that (eg.  
> https://github.com/apple/swift/blob/master/docs/CompilerPerformance.md#driver-diagnosis).
>  Incremental compilation is based on approximating the "true" dependency 
> graph and sometimes this approximation is too coarse; but changing this will 
> be a large amount of work, and the nature of a substantial change to that is 
> still subject to a lot of analysis and design. In the meantime there may also 
> simpler bugs lurking in the dependency-analysis logic, within the current 
> dependency approximation; I'd be happy to help anyone who wants to spend time 
> bug-hunting in this area understand what they're looking at.

Has any thought been put into taking advantage of llbuild for dependency 
graphs? Can some performance improvements come from that?

> That's all I've got for now, but if you have specific bugs, questions, 
> suggestions or comments on the topic, please direct them my way.
> 
> -Graydon
> 
> _______________________________________________
> swift-dev mailing list
> swift-dev@swift.org
> https://lists.swift.org/mailman/listinfo/swift-dev

_______________________________________________
swift-dev mailing list
swift-dev@swift.org
https://lists.swift.org/mailman/listinfo/swift-dev

Reply via email to