Poor LpRun startup performance for simple script
When I have LinqPad up and running new scripts I write compile and execute nearly instantaneously.
However, when running on the command line via LpRun there is quite a long delay even for a trival script (~3-4 seconds).
I'm thinking of working around this by creating an LpRun background process that listens for execution requests and executes them using Util.Run() to avoid the startup overhead.
However, I'm wondering whether others have experienced this performance issue and whether built-in approaches are available for working around this?
However, when running on the command line via LpRun there is quite a long delay even for a trival script (~3-4 seconds).
I'm thinking of working around this by creating an LpRun background process that listens for execution requests and executes them using Util.Run() to avoid the startup overhead.
However, I'm wondering whether others have experienced this performance issue and whether built-in approaches are available for working around this?
Comments
lprun
takes about 4 seconds to return the result of something simple like: so it'd sure be great to find ways to speed it up.for some reason, I used to think it was quicker if I had the LINQPad GUI running, but I've just tested and it seems to make no difference now...
Open the administrator command prompt, and call:
LINQPad.exe -ngen
Note that this won't work with the current beta, because it includes two (conflicting) sets of Roslyn assemblies - one release set and one experimental set for playing with nullable reference types.
latest version 5.31(AnyCPU)
ran ngen and saw that it created files
still about 4 seconds to run anything via commandline, tenths of seconds to run the same script via linqpad
Before running -ngen, I had a script that actually took a little time to run.
I use a stopwatch inside linqpad script, as well as in c# code that calls the script and waits for it to finish.
Script took 1583 milliseconds inside linqpad script.
Running linqpad script - took 7611 ms.
I changed to a script that was just a writeline - bad scientist changing two things at once.
Script took 7 milliseconds inside linqpad script.
Running linqpad script - took 2723 ms.
But you can see linqpad overhead went from about 6 seconds to 2.7 seconds.
This might still be a bit clunky for my intended usage ( writing "macro" type code for automation ). It could probably be resolved with something like caching executables or something, or having a way to generate executables, I don't know.
Or... hmm... it runs fast in linqpad, so what if linqpad is open, could lprun send a message to the running linqpad instance and tell it to run a filename? Perhaps that could be an command line option on lprun or linqpad.exe.
Before -ngen:
Script took 4 milliseconds inside linqpad.
AutoStopWatch Running linqpad script - took 5590 ms.
After:
Script took 4 milliseconds inside linqpad.
2018-06-07 07:22:57.9062 INFO AutoStopWatch Running linqpad script - took 2740 ms.
I'm not sure, seems like I had to run ngen again for installed one. Don't know if it is makes a difference having multiple linqpads in multiple locations.