https://kotlinlang.org logo
#scripting
Title
# scripting
p

Piotr Krzemiński

02/15/2023, 11:18 AM
I’m wondering if anyone came up with a way to: • measure the time of what happens between starting a Kotlin script to the start of execution (how much time it takes to compile and run the JVM) • optimize the above, especially the JVM startup
👀 1
m

mbonnin

02/15/2023, 12:44 PM
Not really an answer to the original question but for scripting, I don't mind the performance too much in general. Adding a few seconds start time is OK for me. If I need more speed, I convert to a plain project and use precompiled artifacts (.jar, K/N, Graal, ...)
p

Piotr Krzemiński

02/15/2023, 12:45 PM
for me generally as well, but I’m trying to foresee certain things that may be pointed out by folks favoring e.g. bash or Python scripts. This is one of the areas where Kotlin is worse
m

mbonnin

02/15/2023, 12:46 PM
Yea, I have no argument for that. Wait for K2 ? 😅
And hope it compiles way faster
Is it possible to try scripting with K2 already actually? 🤔
p

Piotr Krzemiński

02/15/2023, 12:47 PM
that’s why I’m also interested in measuring JVM startup time - K2 won’t influence it, right?
unless script startup time is dominated by compilation, would be nice to prove it if so
b

Big Chungus

02/15/2023, 12:50 PM
1. Wrap kotlin-compiler-embeddable and log time around executing empty script file (or just clone and use petuska.dev/ktx for this experiment) 2. Compilation is cached on first run so subsequent runs skip that step
💡 1
m

mbonnin

02/15/2023, 12:53 PM
I'd expect compilation to be a lot slower than JVM start time. JVM starts in ~30ms on my machine
👍 1
m

mikehearn

02/15/2023, 2:04 PM
For our kotlin scripting app, compilation takes a few seconds and we cache the jars so after that runnin the scripts only has about 30-50msec of jvm startup. AppCDS helps by about 30%
m

mbonnin

02/15/2023, 2:04 PM
AppCDS?
TIL
m

mikehearn

02/15/2023, 2:58 PM
We have an internal kotlin scripting engine called hshell that provides a lot of useful features, we use it instead of bash and it's much nicer. There are functions like
cd
,
ls
,
cp
,
mv
,
find
etc. Can echo markdown to the terminal and it'll be formatted, progress bars are built in, lots of other useful stuff. The only downsides are really the size of the install (lots of features = lots of jars) and the fact that the kotlin compiler is kinda slow. At some point I want to try compiling kotlinc with native image. But even with a few seconds delay when you change a script it's still much more pleasant.
2
m

mbonnin

02/15/2023, 3:03 PM
try compiling kotlinc with native image
You mean turn the Kotlin compiler into a native binary 👀 ?
That sounds like a fun project, make a blog post if you do!
👍 1
p

Piotr Krzemiński

02/15/2023, 3:03 PM
and consider open-sourcing it 😉
1
m

mikehearn

02/15/2023, 3:12 PM
Yeah, turning it into a native binary. It might not be faster for regular kotlin dev because kotlinc uses a daemon that warms up, and peak perf on hotspot is better than native images (CE edition), but for the scripting use case it'd be better. I've thought about open sourcing hshell, but these days I need to make money and also I'm getting older. Maintaining open source projects in my spare time gets less appealing. I've done it in the past and it can turn into an open ended commitment that lasts years. So I've also thought about just selling it for some reasonable price, $50 a user or something.
m

mbonnin

02/15/2023, 3:12 PM
OSS funding is hard...
m

mikehearn

02/15/2023, 3:15 PM
Yeah. If JetBrains or someone else wanted to buy it and open source it, great. I'd definitely consider that. There's also another issue - hshell is largely Kotlin Scripting fused with the internal APIs I developed for Hydraulic Conveyor. It's a sort of build system for win/mac/linux packages so there's lots of file system manipulation, showing of progress, rendering nicely to the console etc. I wrote all those features as independent modules so the logic would look like shell scripting and it worked out well, but, it does mean releasing it as a product effectively freezes parts of the internal APIs which would make the rest of the product development harder.
I've thought about throwing up a promotional website+mailing list form, to try and gauge interest. If enough people were interested then it could become a product. It's already documented and stuff. There's an example script here: https://gist.github.com/mikehearn/5d960e1dae16ca358ccff07679f45aa3
6 Views