dls icon indicating copy to clipboard operation
dls copied to clipboard

Slow Code Analysis on Startup

Open ghost opened this issue 6 years ago • 5 comments

For large codebases this can take a while to run. Especially if there are a lot of errors/warnings it can take up a lot of memory in VS Code. Other IDEs tend to only show this diagnostic data for open files or the currently open file. Possibly adding it as separate functionality to do code analysis on all files? Can't do anything else while this is running either, really annoying on startups.

https://github.com/d-language-server/dls/blob/master/source/dls/tools/analysis_tool.d#L178

ghost avatar May 13 '19 00:05 ghost

This is what DLS did originally, providing diagnostics only for currently open files. I had changed that as per Microsoft's recommendations for implementing language servers:

Basic Report diagnostics for open editors. Minimally, this needs to happen on every save. Better, diagnostics should be computed based on the un-saved contents of the editor.

Advanced Report diagnostics not only for the open editors but for all resources in the open folder, no matter whether they have ever been opened in an editor or not.

But I agree, I tested it on the DMD codebase once and DLS struggled to gather all 2k or so diagnostics. On Windows, even on its own codebase the startup time is sometimes annoying actually... I'll add an option to toggle this behavior on or off.

LaurentTreguier avatar May 13 '19 08:05 LaurentTreguier

It might be fine if it runs in the background, but it blocks pretty much everything else for DLS. Also looking at the output window is kind of laggy because there ends up being 100,000+ warnings.

ghost avatar May 14 '19 20:05 ghost

Are you using multiple workspaces or sub-projects ? There seemed to be a bug where DLS would potentially re-analyze everything multiple times over. I reduced that with the upcoming v0.25.5, though it will probably still be very slow after that nonetheless

LaurentTreguier avatar May 14 '19 21:05 LaurentTreguier

Yah I had the DMD layout src/phobos src/druntime src/dmd in one folder. Not sure if it checked everything twice, may have been doing that. But yah a setting to toggle it off/on would work as well. I don't usually need it. A separate function could work too, though that would be editor specific. Not part of the language server. Ctrl+Shift+P in VS Code then the command like "DLang Analysis entire workspace" or something. Would be more work to do that I feel.

ghost avatar May 15 '19 01:05 ghost

https://github.com/d-language-server/dls/blob/master/source/dls/tools/analysis_tool.d#L195

        foreach (file; discardedFiles)
        {
            send(TextDocument.publishDiagnostics, new PublishDiagnosticsParams(file, []));
        }

This is taking ~50 seconds for me. From the looks of it, it isn't even doing any analysis, it is just pushing messages. Could be that sending messages is just really slow? There's about 7000 but it still shouldn't be taking a minute to send that many messages. I tried using both stdio/sockets took about the same amount of time.

ghost avatar May 16 '19 23:05 ghost