-
Notifications
You must be signed in to change notification settings - Fork 12.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. Weβll occasionally send you account related emails.
Already on GitHub? Sign in to your account
UpdateProjectIfDirty
is slow on large projects
#60633
Comments
Doing a comparable cache in vscode-profile-2024-11-28-09-36-24.cpuprofile Here are also some of the CPU profiles I captured. |
This might make things a bit easier to iterate on. git clone https://github.com/microsoft/vscode
cd vscode
npm ci --ignore-scripts
npm install @typescript/server-replay --no-save --ignore-scripts
cat > replay-script.txt << EOF
{"seq": 1, "type": "request", "command": "updateOpen", "arguments": { "changedFiles": [],"closedFiles":[],"openFiles":[{"file":"@PROJECT_ROOT@/src/vs/workbench/contrib/tasks/browser/task.contribution.ts","projectRootPath":"@PROJECT_ROOT@"}]} }
{"seq": 2, "type": "request", "command": "updateOpen", "arguments": { "changedFiles": [{ "fileName": "@PROJECT_ROOT@/src/vs/workbench/contrib/tasks/browser/task.contribution.ts", "textChanges": [{ "newText": "\n\t\t", "start": { "line": 146, "offset": 78 }, "end": { "line": 146, "offset": 78 } }] }], "closedFiles": [], "openFiles": [] } }
{"seq": 3, "type": "request", "command": "geterr", "arguments": { "delay": 0, "files": [ { "file": "@PROJECT_ROOT@/src/vs/workbench/contrib/tasks/browser/task.contribution.ts"} ] } }
EOF
npx tsreplay ./ replay-script.txt ./node_modules/typescript/lib/tsserver.js --logDir ./ |
@dbaeumer what platform have you experienced this on? On a Linux Codespace, I'm seeing something like 80ms. I'm guessing you might be hitting this on Windows though. |
@DanielRosenwasser I was hitting this on WSL on my laptop. But even 80ms is a lot for a space in a file. When I looked at the code I was under the impression that most of the things that are done around path computations are 'unnecessary'. |
Just to keep you updated, @andrewbranch will be looking into this. |
I get 95ms on WSL on a dev box. Should the difference between a dev box and your laptop be 3x+? @dbaeumer can you send a TS Server log? |
I can produce a server log. But even 95 ms is IMO a lot considering that most of the work is around normalizing paths that are already normalized. |
Here is a tsserver.log from my laptop running on a power adapter. I see times between 170 and 300 ms. |
Thanks, we'll take a look! Just to test things out, #60754 (comment) and #60755 (comment) each have a build you can try out. Can you give us a sense of if either of these fix the issue on your side? If you can profile while running to give us a sense of where the remaining major work is, that would be helpful. |
Times for build 60754 were between 78 - 150 ms with server plugins enabled. |
@dbaeumer great! Can you let us know how the two fixes combine? I've readied a build over at #60800 (comment) |
It would also be helpful to see if the latest changes at #60755 (comment) still get the same wins overall. Thanks for your patience on this. |
@DanielRosenwasser was busy the whole day with a recovery build. Will look into it first thing tomorrow. |
Build from #60800 results in times between 65 and 110 ms |
For 60755 times were between 172ms and 87ms Would there be any way for me to automate this so that I can run something in a loop. I am wondering because JIT might have some impact on this as well. |
When I debugged / traced this I was wondering if it is necessary to create a new program at all in most cases. I know reusing stuff can be tricky but a lot of changes happen inside code which don't change the structure of a program. |
You can use https://www.npmjs.com/package/@typescript/server-harness which is what #60633 (comment) is using under the hood.
That is what Program is doing; it's a snapshot and we carry state between them (Andrew's PR is affecting the perf of that process) |
π Search Terms
UpdateProjectIfDirty language server slow
π Version & Regression Information
β― Playground Link
No response
π» Code
Steps to reproduce:
_ignoreEventForUpdateRunningTasksCount
Observe:
updateGraphWorker
takes roughly 300ms on my machineI took a performance trace and a lot of time is spent in GC and
getNormalizedAbsolutePath
. I added a simply unbound cache to the method likewhich cuts the time for
updateGraphWorker
in half. However there are still some GCs going on and a lot of time is now spent inverifyCompilerOptions
/getNormalizedPathComponents
.π Actual behavior
Takes 300ms to update on key stroke
π Expected behavior
Adding a new line should be even in large project only cost a couple of ms :-)
Additional information about the issue
No response
The text was updated successfully, but these errors were encountered: