Fix 232ms UI hang in call duration timer #836
Open
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
🔗 Issue Links
N/A - Performance improvement identified through profiling
🎯 Goal
Fix a 232ms UI hang that occurs every second during active calls, caused by expensive Swift runtime protocol conformance checking when accessing
@Published
properties in a timer callback.📝 Summary
startedAt
value to avoid@Published
property accessDispatchSourceTimer
instead ofFoundation.Timer
@objc updateDuration()
method by calculating duration inline🛠 Implementation
The issue was discovered through Instruments profiling, which showed
swift_dynamicCast
and protocol conformance checking taking 232ms when the duration timer accessed the@Published var startedAt
property.Root cause: Every second, the timer would access
startedAt
through the@Published
property wrapper, triggering expensive Swift runtime checks for protocol conformances.Solution:
_cachedStartedAt
to store the date without going through@Published
Foundation.Timer
(main thread) toDispatchSourceTimer
(background queue)duration
update happens on main threadThis approach eliminates both the protocol conformance overhead AND keeps the timer work off the main thread.
🎨 Showcase
@Published
access in hot path🧪 Manual Testing Notes
☑️ Contributor Checklist