You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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.
-emit-sil -O shows that we now inline doSomething and extract the value of s.x.a once. As for the original example with properties having initial values, s.x.a != 1 is recognized to always be true, and the body of test() gets optimized away.
Additional Detail from JIRA
md5: 21b9097ec1fefa85821a505929641c74
Issue Description:
re: https://lists.swift.org/pipermail/swift-users/Week-of-Mon-20151207/000172.html
I have a struct Foo 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.
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)
}
The text was updated successfully, but these errors were encountered: