Skip to content

Instantly share code, notes, and snippets.

@VAndrJ
Last active December 18, 2023 21:37
Show Gist options
  • Save VAndrJ/74971788fd4d966d7ff63493491bde1f to your computer and use it in GitHub Desktop.
Save VAndrJ/74971788fd4d966d7ff63493491bde1f to your computer and use it in GitHub Desktop.
Swift built performance benchmark. Results using Xcode 14.3.1.
#!/usr/bin/env python3
import os
filenames = ["a", "b"]
code = [
'someFunc(SomeStruct(str: "Foo"))',
'someFunc(.init(str: "Foo"))'
]
for (i, filename) in enumerate(filenames):
with open(filename + ".swift", "w") as f:
s = 'struct SomeStruct {\nlet str: String\n}\nfunc someFunc(_ value: SomeStruct) {}\n'
for j in range(5000):
s += (code[i] + '\n')
f.write(s)
os.system("hyperfine 'xcrun swiftc -typecheck {}'".format(filename + ".swift"))
#Benchmark 1: xcrun swiftc -typecheck a.swift
# Time (mean ± σ): 1.726 s ± 0.009 s [User: 1.611 s, System: 0.049 s]
# Range (min … max): 1.704 s … 1.735 s 10 runs
#
#Benchmark 1: xcrun swiftc -typecheck b.swift
# Time (mean ± σ): 1.056 s ± 0.009 s [User: 0.934 s, System: 0.057 s]
# Range (min … max): 1.037 s … 1.066 s 10 runs
codeClass = [
'someFunc(SomeClass())',
'someFunc(.init())'
]
for (i, filename) in enumerate(filenames):
with open(filename + ".swift", "w") as f:
s = 'struct SomeClass {}\nfunc someFunc(_ value: SomeClass) {}\n'
for j in range(5000):
s += (codeClass[i] + '\n')
f.write(s)
os.system("hyperfine 'xcrun swiftc -typecheck {}'".format(filename + ".swift"))
#Benchmark 1: xcrun swiftc -typecheck a.swift
# Time (mean ± σ): 1.675 s ± 0.011 s [User: 1.569 s, System: 0.042 s]
# Range (min … max): 1.662 s … 1.702 s 10 runs
#
#Benchmark 1: xcrun swiftc -typecheck b.swift
# Time (mean ± σ): 995.9 ms ± 5.5 ms [User: 887.5 ms, System: 45.9 ms]
# Range (min … max): 989.8 ms … 1007.5 ms 10 runs
codeNested = [
'someFunc(SomeStruct.Nested1.Nested2(str: "Foo"))',
'someFunc(.init(str: "Foo"))'
]
for (i, filename) in enumerate(filenames):
with open(filename + ".swift", "w") as f:
s = 'struct SomeStruct {\nstruct Nested1 {\nstruct Nested2 {\nlet str: String\n}\n}\n}\nfunc someFunc(_ value: SomeStruct.Nested1.Nested2) {}\n'
for j in range(5000):
s += (codeNested[i] + '\n')
f.write(s)
os.system("hyperfine 'xcrun swiftc -typecheck {}'".format(filename + ".swift"))
#Benchmark 1: xcrun swiftc -typecheck a.swift
# Time (mean ± σ): 1.724 s ± 0.006 s [User: 1.617 s, System: 0.045 s]
# Range (min … max): 1.715 s … 1.736 s 10 runs
#
#Benchmark 1: xcrun swiftc -typecheck b.swift
# Time (mean ± σ): 1.038 s ± 0.008 s [User: 0.924 s, System: 0.051 s]
# Range (min … max): 1.030 s … 1.060 s 10 runs
codePoints = [
'someFunc(point: CGPoint(x: {}, y: {}))',
'someFunc(point: .init(x: {}, y: {}))'
]
for (i, filename) in enumerate(filenames):
with open(filename + ".swift", "w") as f:
s = 'import CoreGraphics\nfunc someFunc(point: CGPoint) {}\n'
for j in range(5000):
s += (codePoints[i] + '\n').format(j, j)
f.write(s)
os.system("hyperfine 'xcrun swiftc -typecheck {}'".format(filename + ".swift"))
#Benchmark 1: xcrun swiftc -typecheck a.swift
# Time (mean ± σ): 2.007 s ± 0.012 s [User: 1.828 s, System: 0.115 s]
# Range (min … max): 1.988 s … 2.024 s 10 runs
#
#Benchmark 1: xcrun swiftc -typecheck b.swift
# Time (mean ± σ): 1.310 s ± 0.009 s [User: 1.127 s, System: 0.121 s]
# Range (min … max): 1.298 s … 1.324 s 10 runs
codeMixed = [
'someFunc(data: SomeClass(data: SomeStruct(data: SomeStruct.Nested1.Nested2(point: CGPoint(x: {}, y: {})))))',
'someFunc(data: .init(data: .init(data: .init(point: .init(x: {}, y: {})))))'
]
for (i, filename) in enumerate(filenames):
with open(filename + ".swift", "w") as f:
s = """
import CoreGraphics
struct SomeStruct {
struct Nested1 {
struct Nested2 {
let point: CGPoint
}
}
let data: Nested1.Nested2
}
class SomeClass {
let data: SomeStruct
init(data: SomeStruct) {
self.data = data
}
}
func someFunc(data: SomeClass) {
_ = data.data.data.point
}
"""
for j in range(5000):
s += (codeMixed[i] + '\n').format(j, j)
f.write(s)
os.system("hyperfine 'xcrun swiftc -typecheck {}'".format(filename + ".swift"))
#Benchmark 1: xcrun swiftc -typecheck a.swift
# Time (mean ± σ): 5.959 s ± 0.066 s [User: 5.470 s, System: 0.400 s]
# Range (min … max): 5.879 s … 6.049 s 10 runs
#
#Benchmark 1: xcrun swiftc -typecheck b.swift
# Time (mean ± σ): 1.695 s ± 0.014 s [User: 1.474 s, System: 0.156 s]
# Range (min … max): 1.675 s … 1.713 s 10 runs
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment