Where does the bug appear (feature/product)?
Cursor IDE
Describe the Bug
Inline diff editing performance is poor.
I’ve got a file that has some pending changes (on the order of 50?), I would like to go through and edit them.
Each change (undo / apply action) takes about 20 seconds to apply on my M1 Macbook Pro.
Steps to Reproduce
Make a file, have more than a couple pending changes, try to edit one.
Expected Behavior
You should be able to edit changes at the monitor refresh rate.
Operating System
MacOS
Current Cursor Version (Menu → About Cursor → Copy)
Version: 1.7.39
VSCode Version: 1.99.3
Commit: a9c77ceae65b77ff772d6adfe05f24d8ebcb2790
Date: 2025-10-08T00:33:20.352Z
Electron: 34.5.8
Chromium: 132.0.6834.210
Node.js: 20.19.1
V8: 13.2.152.41-electron.0
OS: Darwin arm64 24.6.0
Additional Information
Taking a flamechart, the removedLinesZoneWidget component is a primary cause. The styles are recalculated on the order of a thousand times, with style mutations followed immediately by reads that trigger a reflow. Reads and writes should be grouped so that each batch of changes causes ideally, a single reflow.
But zooming out, updatePosition is being called with identical lineNumber and column values. Shouldn’t this bail out if they’re identical?
The method below, updateInnerChanges, does a conceptually similar check when cursor.diffs.useCharacterLevelDiffs is enabled, but comparing the JSON stringified values is pretty suboptimal, it’s a known type?
In the inlineDiffController, in getZoneWidgets you’ve got quadratic(? e and t seem to be basically the same size) scaling loops checking equality that should be linear. Iterate over the second zoneWidgets argument (t when minified), build a Map<typeof t[number].id, typeof t>, then once you’ve calculated ${r.removedLinesOriginalRange.startLineNumber}-${r.removedLinesOriginalRange.endLineNumberExclusive}, check the map. Linear scaling, 60 checks instead of 3300?
Does this stop you from using Cursor
Yes - Cursor is unusable
To me and I’m sure many others, the primary feature of Cursor is the state management of AI edits, the ability to ask for changes, have the IDE keep track of pending ones, at which point they can be applied, edited or undone. It’s the primary differentiator against the terminal based systems, and the “killer feature” of Cursor. It not working doesn’t just prevent me from using the IDE, it makes me reconsider whether this IDE is worth using. It’s the kind of feature where its performance should be automatically integration tested before release. It falling over with frankly pretty small work-loads is disappointing.





