Ran into this over the summer.  My understanding is that Michael Gottesman 
(CC’d) has been looking into pattern matching at +0.

The code in SILGenPattern needs to be reworked, but I found this problem 
intersects with the really old dynamic casting entry points in SILGen too which 
would seem to complicate a “simple fix”.  It’d be good to hear what plans, if 
any, there are to address this. It would be a real win to clean all of this up.

~Robert Widmann 

2017/12/28 14:27、Chris Lattner via swift-dev <swift-dev@swift.org>のメール:

> <moving to swift-dev, where most of the perf optimization people lurk>
> 
> This is a great question, I’m not sure what the answer is: maybe it is a 
> simple case missed by the arc optimizer?
> 
> -Chris
> 
> 
> 
>> On Dec 27, 2017, at 9:19 PM, Félix Cloutier via swift-evolution 
>> <swift-evolut...@swift.org> wrote:
>> 
>> Running this on my MBP with 10 as the parameter: 
>> https://gist.github.com/zneak/ae33bb970a08632cfb2925e2049f9e7a 
>> 
>> I get a runtime of about 10 seconds, 45% of which is spent in retain/release 
>> calls according to Instruments (!!), and at least half of that from 
>> Expr.count. Looking at the IR, Swift generously sprinkles retain/release 
>> calls through the outlined copy method:
>> 
>> `self` is retained at the beginning of `count`
>> The values that you get out of destructuring are retained
>> Of course, when you get `count` on these, they are retained again
>> 
>> Of course, Expr.count cannot modify itself or its subexpressions because the 
>> functions are not mutating; in fact, no function in that program can mutate 
>> an enum case. Why, then, is Swift retaining/releasing `self` and the values 
>> obtained from destructured patterns? They can't go away. Shouldn't we be 
>> getting guaranteed references instead of owning references?
>> 
>> That seems to hit pattern-matching-heavy programs with indirect cases pretty 
>> hard, and it's pretty frustrating because that seems to be about the nicest 
>> way to write this program, and there's no workaround from the developer's 
>> perspective. I don't think that this is a fatal flaw of refcounting, but 
>> unless I'm missing something, that's sub-par behavior.
>> 
>> Félix
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolut...@swift.org
>> https://lists.swift.org/mailman/listinfo/swift-evolution
> 
> _______________________________________________
> 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