> On Nov 28, 2017, at 5:01 PM, Mark Lacey via swift-dev <swift-dev@swift.org> 
> wrote:
> 
> 
> 
>> On Nov 19, 2017, at 9:02 PM, Brian Gesiak via swift-dev <swift-dev@swift.org 
>> <mailto:swift-dev@swift.org>> wrote:
>> 
>> Thanks for the reply, Graydon, and for your other email on the topic 
>> <https://lists.swift.org/pipermail/swift-dev/Week-of-Mon-20171113/006001.html>!
>> 
>> I need to take more time to look into some of the things you mentioned, but 
>> I won't be able to do so in earnest for another few days. In the meantime, 
>> I'll just reply with a few uninformed opinions -- feel free not to respond 
>> to these :)
>> 
>> On Fri, Nov 17, 2017 at 12:54 AM, Graydon Hoare <gho...@apple.com 
>> <mailto:gho...@apple.com>> wrote:
>> Sadly, there's not always a 1:1 mapping between source entities and time 
>> like that. Certainly _some_ cases can be so egregious (say, typechecking 
>> time on an expression that's triggering an exponential-time inference) that 
>> they dominate compile time, and can be identified-and-fixed in isolation; 
>> but often the total amount of work attributable to a given source entity is 
>> spread around the compilation, occurs in multiple phases, emerges out of 
>> interaction between entities, overlaps with others, etc.
>> 
>> It's these particularly egregious cases that I had in mind when I wrote my 
>> email. Many blog posts on "how to reduce your Swift project compile times" 
>> suggest one of the following approaches:
>> 
>> 1. Use `-debug-time-function-bodies` and `-debug-time-expression-checking` 
>> to print a list of times, sort those lists in descending order of time 
>> spent, and add explicit types to, or otherwise simplify, the slowest 
>> functions and expressions.
>> 2. Use `-warn-long-function-bodies=` and 
>> `-warn-long-expression-type-checking=`. Compile the project several times, 
>> gradually lowering the thresholds passed to these options, in order to 
>> surface the slowest functions and expressions. Add explicit types to or 
>> otherwise simplify the slowest functions and expressions.
> 
> One of the drawbacks with the type checker timers is that they do not exclude 
> the time spent in client code called by the type checker, e.g. in 
> deserialization code. The result is that you can e.g. have a simple 
> expression involving a stdlib type like String, and have it be reported as 
> taking 500ms to type check, when in fact it’s nearly instantaneous to type 
> check, but we spent 500ms deserializing things while type checking that 
> expression. What gets really confusing about this is some of this 
> deserializing only happens if you don’t use explicit types, so adding an 
> explicit type to one of these expressions can mean that this expression is 
> now fast, but some other expression which was previously reported as being 
> fast now suddenly “regresses” and takes 500ms due to that deserialization 
> happening later.

On the flip side, I would argue that if referencing a single stdlib declaration 
like String results in 500ms spent in deserialization, we have a problem, even 
if it s a one-time cost. In multiple-frontend mode, every source file will end 
up paying the 500ms penalty.

> 
> I haven’t looked closely, but offhand I don’t know of a clean, robust, 
> maintainable way of excluding this time.
> 
> I’m a bit concerned about productizing these without solving that problem.
> 
> It’s also not necessarily reasonable that we’re doing this deserialization 
> when an explicit type is not used so there might be something useful to 
> investigate and fix there as well.
> 
> Mark
> 
>> 
>> My original idea was to expand or improve these options, since I think 
>> they'll continue to be useful for large Swift projects. But I'm certainly 
>> open to working on something else instead.
>>  
>> I don't have an especially strong feeling about the degree-of-support / 
>> stability of such features; I'm going to have to leave that part of your 
>> question to others.
>> 
>> Yeah, this is definitely still an open question of mine. In the meantime 
>> I'll try looking at some of the other approaches you've suggested (thanks!).
>> 
>>   1. See if you can leverage the existing counters and stats-gathering / 
>> reporting machinery in the compiler; for example the -trace-stats-events 
>> infrastructure lets you bundle together work done on behalf of a given 
>> source range and any changes to compiler counters during that work, as a 
>> single virtual "stats-event" in processing, and trace those events to a .csv 
>> file. Maybe something related to that would be helpful for the task you're 
>> interested in?
>> 
>> I wasn't aware of `-trace-stats-events`, thanks! When using 
>> `-stats-output-dir` with a primary-file compilation mode, I can see that the 
>> stats include the amount of time spent on each Swift module being produced. 
>> I'll need to take a closer look at how `-trace-stats-events` works, though 
>> -- I get an empty .csv file when I use that option in conjunction with 
>> `-stats-output-dir`, and I'm not sure yet how to use it with source ranges. 
>> I'll look into this further.
>>  
>>   2. Consider going up a level from declarations or functions to _files_, 
>> and see if there's a useful way to visualize hot-spots in the inter-file 
>> dependency graph that the driver interprets, during incremental compilation. 
>> The units of work at this level are likely to be large (especially if they 
>> involve cascading dependencies, that invalidate "downstream" files) and 
>> often cutting or changing an edge in that graph can be a simpler matter of 
>> moving a declaration, or changing its visibility: reasonably easy changes 
>> that don't cost the user much to experiment with.
>> 
>> Hope that helps! Happy to discuss any of this further.
>> 
>> Yes, thank you! I'm also interested in the "improving incremental mode" 
>> section of your other email, so thanks for writing all that down.
>> 
>> - Brian Gesiak
>> 
>> _______________________________________________
>> swift-dev mailing list
>> swift-dev@swift.org <mailto:swift-dev@swift.org>
>> https://lists.swift.org/mailman/listinfo/swift-dev
> 
> _______________________________________________
> swift-dev mailing list
> swift-dev@swift.org <mailto:swift-dev@swift.org>
> https://lists.swift.org/mailman/listinfo/swift-dev 
> <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