[swift-users] Are structs really always pessimistically copied when calling funcs?

Joe Groff jgroff at apple.com
Mon Dec 7 11:53:52 CST 2015


> On Dec 6, 2015, at 5:16 PM, Karl Pickett via swift-users <swift-users at 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 at swift.org
> https://lists.swift.org/mailman/listinfo/swift-users

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-users/attachments/20151207/65c23ba7/attachment.html>


More information about the swift-users mailing list