Skip to content

⚡ Bolt: Cache shared Date/Byte formatters to avoid performance overhead#155

Open
acebytes wants to merge 1 commit intomainfrom
bolt-formatter-optimization-8932335954510036365
Open

⚡ Bolt: Cache shared Date/Byte formatters to avoid performance overhead#155
acebytes wants to merge 1 commit intomainfrom
bolt-formatter-optimization-8932335954510036365

Conversation

@acebytes
Copy link
Copy Markdown
Contributor

💡 What: Extracted shared instances of ByteCountFormatter and ISO8601DateFormatter into a Formatters enum. 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 .formattedSize on large collections (like NodeModulesItem and ScanResult), 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

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>
@google-labs-jules
Copy link
Copy Markdown
Contributor

👋 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 @jules. You can find this option in the Pull Request section of your global Jules UI settings. You can always switch back!

New to Jules? Learn more at jules.google/docs.


For security, I will only act on instructions from the user who triggered this task.

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

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

💡 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 = {
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge 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 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant