> On Jun 9, 2016, at 12:27 PM, Charlie Monroe via swift-evolution 
> <swift-evolution@swift.org> wrote:
> 
> 
>>> On Jun 9, 2016, at 10:29 AM, Brent Royal-Gordon <br...@architechies.com> 
>>> wrote:
>>> 
>>> I've taken the time to run a test, going through milion numbers (several 
>>> times) using:
>>> 
>>> for i in arr { if i % 2 == 0 { continue } }
>>> for i in arr where i % 2 == 0 { }
>>> for i in arr.filter({ $0 % 2 == 0 }) { }
>>> for i in arr.lazy.filter({ $0 % 2 == 0 }) { }
>>> 
>>> Results:
>>> 
>>> - plain for loop with if-continue: 27.19 seconds (+1.76%)
>>> - with where: 26.72 seconds (+0.00%)
>>> - .filter: 44.73 seconds (+67.40%)
>>> - .lazy.filter: 31.66 seconds (+18.48%)
>> 
>> This is great data. I have a hard time imagining a little compiler work 
>> couldn't make if-continue as fast as for-where, but lazy.filter might be a 
>> taller order for it, and optimizing plain filter could actually change 
>> behavior.
>> 
>> A month or two ago, I actually fell into the "just use the higher-order 
>> functions" camp on this question, but I've been rethinking that more and 
>> more lately. Between the trailing closure incompatibility, the need to 
>> remember to use `lazy` to get decent performance, and now the noticeable 
>> speed difference even *with* lazy, I'm no longer convinced that answer is 
>> good enough.
> 
> There will IMHO always be noticeable overhead since you're calling a function 
> which is then invoking a closure. When you look at what that means:
> 
> - thunks generated around the invocation, which are a few instructions
> - new stack frame for each call (correct me if I'm wrong). 
> 
> So instead of a single `i % 2 == 0` (which is just 2-3 instructions, 
> depending on the architecture and optimization settings), it will invoke the 
> closure milion times, if the array contains a milion members.
> 
> Maybe I'm over-optimizing, but 18% seemed like a lot to me.

It looks like this should not be fate, and a pattern that could end up 
generating the same code after proper inlining.

> 
> 
>> 
>> (Though I do think `while` is probably too niche to bother with as a 
>> first-class feature, and I am open to if-continue on the `where` clause.)
>> 
>> -- 
>> Brent Royal-Gordon
>> Architechies
> 
> _______________________________________________
> swift-evolution mailing list
> swift-evolution@swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution
_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to