Skip to content

Conversation

sidepelican
Copy link
Contributor

Fix huge compile time of ByteBuffer.setUUIDBytes

Motivation:

ByteBuffer.setUUIDBytes takes a lot of compile time.

$ swift package clean && swift build --target NIOFoundationCompat -Xswiftc -debug-time-function-bodies | grep "ByteBuffer-foundation"
0.24ms	/Users/iceman/github/swift-nio/Sources/NIOFoundationCompat/ByteBuffer-foundation.swift:215:26	instance method writeContiguousBytes(_:)
0.35ms	/Users/iceman/github/swift-nio/Sources/NIOFoundationCompat/ByteBuffer-foundation.swift:229:26	instance method setContiguousBytes(_:at:)
0.15ms	/Users/iceman/github/swift-nio/Sources/NIOFoundationCompat/ByteBuffer-foundation.swift:242:26	instance method writeData(_:)
2.38ms	/Users/iceman/github/swift-nio/Sources/NIOFoundationCompat/ByteBuffer-foundation.swift:256:26	instance method setData(_:at:)
[174/175] Compiling NIOFoundationCompat ByteBuffer-foundation.swift
0.15ms	/Users/iceman/github/swift-nio/Sources/NIOFoundationCompat/ByteBuffer-foundation.swift:65:26	instance method readData(length:)
0.26ms	/Users/iceman/github/swift-nio/Sources/NIOFoundationCompat/ByteBuffer-foundation.swift:78:26	instance method readData(length:byteTransferStrategy:)
0.07ms	/Users/iceman/github/swift-nio/Sources/NIOFoundationCompat/ByteBuffer-foundation.swift:97:17	instance method getData(at:length:)
7.06ms	/Users/iceman/github/swift-nio/Sources/NIOFoundationCompat/ByteBuffer-foundation.swift:110:17	instance method getData(at:length:byteTransferStrategy:)
1.24ms	/Users/iceman/github/swift-nio/Sources/NIOFoundationCompat/ByteBuffer-foundation.swift:149:17	instance method getString(at:length:encoding:)
0.29ms	/Users/iceman/github/swift-nio/Sources/NIOFoundationCompat/ByteBuffer-foundation.swift:163:26	instance method readString(length:encoding:)
0.15ms	/Users/iceman/github/swift-nio/Sources/NIOFoundationCompat/ByteBuffer-foundation.swift:182:26	instance method writeString(_:encoding:)
1.05ms	/Users/iceman/github/swift-nio/Sources/NIOFoundationCompat/ByteBuffer-foundation.swift:196:26	instance method setString(_:encoding:at:)
0.25ms	/Users/iceman/github/swift-nio/Sources/NIOFoundationCompat/ByteBuffer-foundation.swift:203:12	initializer init(data:)
0.13ms	/Users/iceman/github/swift-nio/Sources/NIOFoundationCompat/ByteBuffer-foundation.swift:215:26	instance method writeContiguousBytes(_:)
0.18ms	/Users/iceman/github/swift-nio/Sources/NIOFoundationCompat/ByteBuffer-foundation.swift:229:26	instance method setContiguousBytes(_:at:)
0.11ms	/Users/iceman/github/swift-nio/Sources/NIOFoundationCompat/ByteBuffer-foundation.swift:242:26	instance method writeData(_:)
1.03ms	/Users/iceman/github/swift-nio/Sources/NIOFoundationCompat/ByteBuffer-foundation.swift:256:26	instance method setData(_:at:)
5.74ms	/Users/iceman/github/swift-nio/Sources/NIOFoundationCompat/ByteBuffer-foundation.swift:278:17	instance method getUUIDBytes(at:)
8023.77ms	/Users/iceman/github/swift-nio/Sources/NIOFoundationCompat/ByteBuffer-foundation.swift:314:26	instance method setUUIDBytes(_:at:)
0.26ms	/Users/iceman/github/swift-nio/Sources/NIOFoundationCompat/ByteBuffer-foundation.swift:345:26	instance method readUUIDBytes()
0.11ms	/Users/iceman/github/swift-nio/Sources/NIOFoundationCompat/ByteBuffer-foundation.swift:358:26	instance method writeUUIDBytes(_:)
0.32ms	/Users/iceman/github/swift-nio/Sources/NIOFoundationCompat/ByteBuffer-foundation.swift:370:17	instance method buffer(data:)
0.23ms	/Users/iceman/github/swift-nio/Sources/NIOFoundationCompat/ByteBuffer-foundation.swift:383:57	getter regions
0.09ms	/Users/iceman/github/swift-nio/Sources/NIOFoundationCompat/ByteBuffer-foundation.swift:395:12	initializer init(buffer:byteTransferStrategy:)

It takes 8000ms and it is 110000x slower than the minimum one.

Modifications:

It is assumed that the compile time is increasing exponentially due to the increase in the number of undetermined type variables in the type inference process.
So use |= operator instead of | to reduce undetermined type variables.

Result:

$ swift package clean && swift build --target NIOFoundationCompat -Xswiftc -debug-time-function-bodies | grep "ByteBuffer-foundation"
0.24ms	/Users/iceman/github/swift-nio/Sources/NIOFoundationCompat/ByteBuffer-foundation.swift:215:26	instance method writeContiguousBytes(_:)
0.25ms	/Users/iceman/github/swift-nio/Sources/NIOFoundationCompat/ByteBuffer-foundation.swift:229:26	instance method setContiguousBytes(_:at:)
0.13ms	/Users/iceman/github/swift-nio/Sources/NIOFoundationCompat/ByteBuffer-foundation.swift:242:26	instance method writeData(_:)
2.23ms	/Users/iceman/github/swift-nio/Sources/NIOFoundationCompat/ByteBuffer-foundation.swift:256:26	instance method setData(_:at:)
[175/175] Compiling NIOFoundationCompat ByteBuffer-foundation.swift
0.17ms	/Users/iceman/github/swift-nio/Sources/NIOFoundationCompat/ByteBuffer-foundation.swift:65:26	instance method readData(length:)
0.27ms	/Users/iceman/github/swift-nio/Sources/NIOFoundationCompat/ByteBuffer-foundation.swift:78:26	instance method readData(length:byteTransferStrategy:)
0.07ms	/Users/iceman/github/swift-nio/Sources/NIOFoundationCompat/ByteBuffer-foundation.swift:97:17	instance method getData(at:length:)
6.95ms	/Users/iceman/github/swift-nio/Sources/NIOFoundationCompat/ByteBuffer-foundation.swift:110:17	instance method getData(at:length:byteTransferStrategy:)
1.37ms	/Users/iceman/github/swift-nio/Sources/NIOFoundationCompat/ByteBuffer-foundation.swift:149:17	instance method getString(at:length:encoding:)
0.27ms	/Users/iceman/github/swift-nio/Sources/NIOFoundationCompat/ByteBuffer-foundation.swift:163:26	instance method readString(length:encoding:)
0.14ms	/Users/iceman/github/swift-nio/Sources/NIOFoundationCompat/ByteBuffer-foundation.swift:182:26	instance method writeString(_:encoding:)
0.85ms	/Users/iceman/github/swift-nio/Sources/NIOFoundationCompat/ByteBuffer-foundation.swift:196:26	instance method setString(_:encoding:at:)
0.28ms	/Users/iceman/github/swift-nio/Sources/NIOFoundationCompat/ByteBuffer-foundation.swift:203:12	initializer init(data:)
0.12ms	/Users/iceman/github/swift-nio/Sources/NIOFoundationCompat/ByteBuffer-foundation.swift:215:26	instance method writeContiguousBytes(_:)
0.17ms	/Users/iceman/github/swift-nio/Sources/NIOFoundationCompat/ByteBuffer-foundation.swift:229:26	instance method setContiguousBytes(_:at:)
0.11ms	/Users/iceman/github/swift-nio/Sources/NIOFoundationCompat/ByteBuffer-foundation.swift:242:26	instance method writeData(_:)
1.05ms	/Users/iceman/github/swift-nio/Sources/NIOFoundationCompat/ByteBuffer-foundation.swift:256:26	instance method setData(_:at:)
5.63ms	/Users/iceman/github/swift-nio/Sources/NIOFoundationCompat/ByteBuffer-foundation.swift:278:17	instance method getUUIDBytes(at:)
17.57ms	/Users/iceman/github/swift-nio/Sources/NIOFoundationCompat/ByteBuffer-foundation.swift:314:26	instance method setUUIDBytes(_:at:)
0.21ms	/Users/iceman/github/swift-nio/Sources/NIOFoundationCompat/ByteBuffer-foundation.swift:345:26	instance method readUUIDBytes()
0.10ms	/Users/iceman/github/swift-nio/Sources/NIOFoundationCompat/ByteBuffer-foundation.swift:358:26	instance method writeUUIDBytes(_:)
0.27ms	/Users/iceman/github/swift-nio/Sources/NIOFoundationCompat/ByteBuffer-foundation.swift:370:17	instance method buffer(data:)
0.08ms	/Users/iceman/github/swift-nio/Sources/NIOFoundationCompat/ByteBuffer-foundation.swift:383:57	getter regions
0.08ms	/Users/iceman/github/swift-nio/Sources/NIOFoundationCompat/ByteBuffer-foundation.swift:395:12	initializer init(buffer:byteTransferStrategy:)

450x faster build time!

env

macOS 13.4.1 (c)

$ swift --version                                                                                                                    
swift-driver version: 1.75.2 Apple Swift version 5.8 (swiftlang-5.8.0.124.2 clang-1403.0.22.11.100)
Target: arm64-apple-macosx13.0

Copy link

@1proprogrammerchant 1proprogrammerchant left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hmmm

Copy link
Contributor

@glbrntt glbrntt left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Interesting! Thanks for fixing this.

@glbrntt
Copy link
Contributor

glbrntt commented Jul 26, 2023

@swift-server-bot test this please

@glbrntt glbrntt enabled auto-merge (squash) July 26, 2023 08:00
@glbrntt glbrntt merged commit b0d43ec into apple:main Jul 26, 2023
@sidepelican sidepelican deleted the setUUIDBytes-compile-time branch July 26, 2023 08:18
@glbrntt glbrntt added the 🔨 semver/patch No public API change. label Jul 26, 2023
1proprogrammerchant added a commit to 1proprogrammerchant/swift-nio that referenced this pull request Jul 26, 2023
Fix huge compile time of setUUIDBytes (apple#2482)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
🔨 semver/patch No public API change.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants