> On Dec 7, 2015, at 10:27 AM, Karl Pickett <karl.pick...@gmail.com> wrote:
> 
> I created https://bugs.swift.org/browse/SR-110 
> <https://bugs.swift.org/browse/SR-110> for the compiler.  However, I also 
> think that the documentation needs an issue filed.  (Where to do that at?) 

Thanks!

> The current docs say structs are always copied (the only exception being 
> inout to memory variable optimization).  That would make programmers worried 
> about speed and stack usage run away screaming, and not give swift a try.

If weren't already been chased away by 'vars are always allocated on the heap'. 
The docs generally discuss high-level semantic behavior rather than the real 
code emitted; in general, users can count on structs being copied whenever 
necessary to preserve value semantics between different names. How would you 
suggest rewording the documentation?

-Joe

> On Mon, Dec 7, 2015 at 11:53 AM, Joe Groff <jgr...@apple.com 
> <mailto:jgr...@apple.com>> wrote:
> 
>> On Dec 6, 2015, at 5:16 PM, Karl Pickett via swift-users 
>> <swift-users@swift.org <mailto:swift-users@swift.org>> wrote:
>> 
>> I have a struct and this code:
>> 
>> func test() {
>>     precondition(sizeof(Foo) == 128)
>> 
>>     let s = Foo()
>>     for _ in 0..<100_000_000 {
>>         doSomething(s)
>>     }
>> }
>> 
>> The asm (on LInux, with -O) is showing me that s is being re-initialized on 
>> every iteration of the loop.  I was hoping that thanks to swift's strict 
>> constness rules on structs, it wouldn't have to do this - and just pass the 
>> same pointer to doSomething() each time.
>> 
>> When I use an inout param, that is 2x as fast and doesn't re-initialize each 
>> time.  However I don't see why passing something immutably wouldn't be as 
>> fast.
> 
> This definitely seems like a place where we ought to be able to peephole the 
> extra copies away. Mind filing a bug?
> 
> -Joe
> 
>> 
>> - Karl
>> 
>> asm from perf:
>> 
>>   2.71 │50:┌─→xorps  %xmm0,%xmm0                                             
>>                                              ▒
>>   8.06 │   │  movaps %xmm0,-0x20(%rbp)                                       
>>                                              ▒
>>   2.71 │   │  movaps %xmm0,-0x30(%rbp)                                       
>>                                              ▒
>>   7.41 │   │  movaps %xmm0,-0x40(%rbp)                                       
>>                                              ▒
>>  10.59 │   │  movaps %xmm0,-0x50(%rbp)                                       
>>                                              ▒
>>  10.00 │   │  movaps %xmm0,-0x60(%rbp)                                       
>>                                              ▒
>>   9.53 │   │  movaps %xmm0,-0x70(%rbp)                                       
>>                                              ▒
>>  10.65 │   │  movaps %xmm0,-0x80(%rbp)                                       
>>                                              ▒
>>  11.24 │   │  movaps %xmm0,-0x90(%rbp)                                       
>>                                              ▒
>>  12.06 │   │  mov    %r14,%rdi                                               
>>                                              ▒
>>   3.41 │   │→ callq  _TF4main11doSomethingFVS_3FooT_                         
>>                                              ▒
>>   2.82 │   │  dec    %rbx                                                    
>>                                              ▒
>>   8.82 │   └──jne    50             
>> 
>> main.swift:
>> 
>> struct Vec4 {
>>     var a: Int64 = 0
>>     var b: Int64 = 0
>>     var c: Int64 = 0
>>     var d: Int64 = 0
>> }
>> 
>> struct Foo {
>>     var x: Vec4 = Vec4()
>>     var y: Vec4 = Vec4()
>>     var z: Vec4 = Vec4()
>>     var u: Vec4 = Vec4()
>> }
>> 
>> func test() {
>>     precondition(sizeof(Foo) == 128)
>> 
>>     let s = Foo()
>>     for _ in 0..<100_000_000 {
>>         doSomething(s)
>>     }
>> }
>> 
>> test()
>> 
>> 
>> lib.swift:
>> 
>> func doSomething(s: Foo) {
>>     precondition(s.x.a != 1)
>> }
>>  _______________________________________________
>> swift-users mailing list
>> swift-users@swift.org <mailto:swift-users@swift.org>
>> https://lists.swift.org/mailman/listinfo/swift-users 
>> <https://lists.swift.org/mailman/listinfo/swift-users>
_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users

Reply via email to