⚡ Bolt: Cache shared Date/Byte formatters to avoid performance overhead#155
⚡ Bolt: Cache shared Date/Byte formatters to avoid performance overhead#155
Conversation
Foundation formatters like `ByteCountFormatter` and `ISO8601DateFormatter` are expensive to instantiate. Previously, they were being allocated inline during property access (e.g. `formattedSize`), running hundreds of times when rendering lists of NodeModules or Cache categories. This extracts them into a central `Formatters` enum with static variables. Co-authored-by: acebytes <2820910+acebytes@users.noreply.github.com>
|
👋 Jules, reporting for duty! I'm here to lend a hand with this pull request. When you start a review, I'll add a 👀 emoji to each comment to let you know I've read it. I'll focus on feedback directed at me and will do my best to stay out of conversations between you and other bots or reviewers to keep the noise down. I'll push a commit with your requested changes shortly after. Please note there might be a delay between these steps, but rest assured I'm on the job! For more direct control, you can switch me to Reactive Mode. When this mode is on, I will only act on comments where you specifically mention me with New to Jules? Learn more at jules.google/docs. For security, I will only act on instructions from the user who triggered this task. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: b58794c7a5
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| import Foundation | ||
|
|
||
| public enum Formatters { | ||
| public static let byteCount: ByteCountFormatter = { |
There was a problem hiding this comment.
Isolate shared formatter cache to a single actor
Formatters now stores ByteCountFormatter (and similarly ISO8601DateFormatter below) as global static state that is read from multiple isolation domains (@MainActor UI code and the CacheCleaner actor). These formatter classes are non-Sendable, so this pattern triggers Swift concurrency safety diagnostics (MutableGlobalVariable) and becomes an error in Swift 6 mode; it also risks concurrent access to shared mutable formatter internals at runtime. Please keep formatter usage actor-confined (or otherwise synchronized) instead of exposing process-wide shared instances.
Useful? React with 👍 / 👎.
💡 What: Extracted shared instances of
ByteCountFormatterandISO8601DateFormatterinto aFormattersenum. Replaced inline creation with these shared static variables.🎯 Why: These formatters are notoriously expensive to allocate. They were previously being allocated inside heavily-used computed properties like
.formattedSizeon large collections (likeNodeModulesItemandScanResult), significantly slowing down UI rendering.📊 Impact: Substantially reduces memory pressure and layout time in views displaying many scanned files/directories.
🔬 Measurement: Run the app with and without the change on a directory with thousands of node_modules to observe lower CPU usage during rendering and lower total memory allocation via Instruments.
PR created automatically by Jules for task 8932335954510036365 started by @acebytes