Skip to content

Terminal Serializer Optimization#24485

Merged
jacob314 merged 1 commit intomainfrom
branch_TERMINAL_SERIALIZE
Apr 2, 2026
Merged

Terminal Serializer Optimization#24485
jacob314 merged 1 commit intomainfrom
branch_TERMINAL_SERIALIZE

Conversation

@jacob314
Copy link
Copy Markdown
Contributor

@jacob314 jacob314 commented Apr 2, 2026

Summary

The terminal serializer is called when streaming shell output.
It previously allocated a an object for every character which was inefficient and contributed to V8 memory pressure.

To mitigate, refactored the code to avoid any O(rows x cols) allocs every frame.

@jacob314 jacob314 requested a review from a team as a code owner April 2, 2026 02:16
@gemini-code-assist
Copy link
Copy Markdown
Contributor

Summary of Changes

Hello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request optimizes the terminal serialization process by eliminating unnecessary object creation and class instantiation within the main processing loop. By refactoring the logic to use primitive types for state tracking, the serialization becomes more efficient and less memory-intensive, while maintaining the same functional output.

Highlights

  • Performance Optimization: Removed the Cell class and its associated object allocations within the terminal serialization loop to improve performance and reduce memory overhead.
  • Logic Refactoring: Replaced the object-based cell comparison logic with direct primitive comparisons for terminal state tracking during serialization.
  • Test Update: Updated the terminal serializer test to include a carriage return and line feed, ensuring more accurate simulation of terminal output.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for GitHub and other Google products, sign up here.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

@gemini-cli
Copy link
Copy Markdown
Contributor

gemini-cli bot commented Apr 2, 2026

Hi @jacob314, thank you so much for your contribution to Gemini CLI! We really appreciate the time and effort you've put into this.

We're making some updates to our contribution process to improve how we track and review changes. Please take a moment to review our recent discussion post: Improving Our Contribution Process & Introducing New Guidelines.

Key Update: Starting January 26, 2026, the Gemini CLI project will require all pull requests to be associated with an existing issue. Any pull requests not linked to an issue by that date will be automatically closed.

Thank you for your understanding and for being a part of our community!

@github-actions
Copy link
Copy Markdown

github-actions bot commented Apr 2, 2026

Size Change: +67 B (0%)

Total Size: 34.6 MB

Filename Size Change
./bundle/chunk-IKPPUSWN.js 0 B -14.7 MB (removed) 🏆
./bundle/chunk-UMYFQ3NT.js 0 B -3.82 MB (removed) 🏆
./bundle/core-OUZUHA6E.js 0 B -44.9 kB (removed) 🏆
./bundle/devtoolsService-HAQXIDVG.js 0 B -28.4 kB (removed) 🏆
./bundle/interactiveCli-5ZA7EBUD.js 0 B -1.66 MB (removed) 🏆
./bundle/oauth2-provider-2X5YDNUB.js 0 B -9.16 kB (removed) 🏆
./bundle/chunk-KSNYH5WS.js 3.82 MB +3.82 MB (new file) 🆕
./bundle/chunk-S7NLJPCJ.js 14.7 MB +14.7 MB (new file) 🆕
./bundle/core-3PNXADSD.js 44.9 kB +44.9 kB (new file) 🆕
./bundle/devtoolsService-PCWPMX4E.js 28.4 kB +28.4 kB (new file) 🆕
./bundle/interactiveCli-CRBZIHCO.js 1.66 MB +1.66 MB (new file) 🆕
./bundle/oauth2-provider-KAU2MN2R.js 9.16 kB +9.16 kB (new file) 🆕
ℹ️ View Unchanged
Filename Size
./bundle/bundled/third_party/index.js 8 MB
./bundle/chunk-34MYV7JD.js 2.45 kB
./bundle/chunk-5AUYMPVF.js 858 B
./bundle/chunk-664ZODQF.js 124 kB
./bundle/chunk-DAHVX5MI.js 206 kB
./bundle/chunk-IUUIT4SU.js 56.5 kB
./bundle/chunk-QINJHSX2.js 1.96 MB
./bundle/chunk-RJTRUG2J.js 39.8 kB
./bundle/chunk-U4FACSVX.js 1.13 kB
./bundle/devtools-36NN55EP.js 696 kB
./bundle/dist-T73EYRDX.js 356 B
./bundle/events-CLX3JQHP.js 418 B
./bundle/gemini.js 533 kB
./bundle/getMachineId-bsd-TXG52NKR.js 1.55 kB
./bundle/getMachineId-darwin-7OE4DDZ6.js 1.55 kB
./bundle/getMachineId-linux-SHIFKOOX.js 1.34 kB
./bundle/getMachineId-unsupported-5U5DOEYY.js 1.06 kB
./bundle/getMachineId-win-6KLLGOI4.js 1.72 kB
./bundle/memoryDiscovery-QW3GLOLV.js 980 B
./bundle/multipart-parser-KPBZEGQU.js 11.7 kB
./bundle/node_modules/@google/gemini-cli-devtools/dist/client/main.js 222 kB
./bundle/node_modules/@google/gemini-cli-devtools/dist/src/_client-assets.js 229 kB
./bundle/node_modules/@google/gemini-cli-devtools/dist/src/index.js 13.4 kB
./bundle/node_modules/@google/gemini-cli-devtools/dist/src/types.js 132 B
./bundle/sandbox-macos-permissive-open.sb 890 B
./bundle/sandbox-macos-permissive-proxied.sb 1.31 kB
./bundle/sandbox-macos-restrictive-open.sb 3.36 kB
./bundle/sandbox-macos-restrictive-proxied.sb 3.56 kB
./bundle/sandbox-macos-strict-open.sb 4.82 kB
./bundle/sandbox-macos-strict-proxied.sb 5.02 kB
./bundle/src-QVCVGIUX.js 47 kB
./bundle/tree-sitter-7U6MW5PS.js 274 kB
./bundle/tree-sitter-bash-34ZGLXVX.js 1.84 MB

compressed-size-action

Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

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

Code Review

This pull request refactors the terminal serialization logic in packages/core/src/utils/terminalSerializer.ts by removing the Cell class and manual instance reuse in favor of a more direct, state-based approach for processing terminal cells. It also updates the test case in packages/core/src/utils/terminalSerializer.test.ts to include a newline character in the input string. I have no feedback to provide on these changes.

Resolves high volume object allocation during terminal serialization when rendering shell streams, by utilizing xterm.js pre-allocated `getNullCell()` to avoid allocating a new `IBufferCell` object on every character.

This reverts the original attempt in #24485 and implements the correct xterm.js optimization pattern, which maintains the `Cell` class wrapper and avoids subtle logic regressions with inverted text/cursor bounds handling.
@jacob314 jacob314 force-pushed the branch_TERMINAL_SERIALIZE branch from fac1966 to 42c94e6 Compare April 2, 2026 02:33

for (let x = 0; x < terminal.cols; x++) {
const cellData = line.getCell(x);
const cellData = line.getCell(x, cellBuffer);
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

subtle change that avoids allocating a new Cell object for ever O(rows x cols) chars in the terminal when streaming output from the shell.

@gemini-cli gemini-cli bot added the status/need-issue Pull requests that need to have an associated issue. label Apr 2, 2026
@jacob314 jacob314 added this pull request to the merge queue Apr 2, 2026
Merged via the queue into main with commit 18cdbbf Apr 2, 2026
30 checks passed
@jacob314 jacob314 deleted the branch_TERMINAL_SERIALIZE branch April 2, 2026 03:08
theerud pushed a commit to theerud/gemini-cli that referenced this pull request Apr 2, 2026
danzaharia1 pushed a commit that referenced this pull request Apr 2, 2026
kalenkevich pushed a commit to kalenkevich/gemini-cli that referenced this pull request Apr 3, 2026
afanty2021 pushed a commit to afanty2021/gemini-cli that referenced this pull request Apr 4, 2026
warrenzhu25 pushed a commit to warrenzhu25/gemini-cli that referenced this pull request Apr 9, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

status/need-issue Pull requests that need to have an associated issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants