It's become increasingly frustrating that JVM startup is still so much
slower than most command-line programs.
In the JRuby world, we've now managed to convincingly pass the C
implementation of Ruby 1.8 in performance. But even on the fastest
systems, our startup time is a good couple seconds. At its worst, it can
be as high as ten seconds. Our users are very tired of waiting.
http://www.martiansoftware.com/nailgun/index.html
Nailgun is a project that appears to be mostly dead since 2005, but it
basically provides a simple "JVM server" on one end and a native client
on the other. You call ng like you'd call java, with a class and
arguments it should be passed. And it sends that class and arguments
across a socket to the ng server, where the class is started up and the
streams are all piped back and forth. When the class terminates, the
client terminates.
Here's a sample of JRuby startup time on OS X Java 6, first normal and
then with ng:
normal:
~/NetBeansProjects/jruby $ time jruby -e "puts 'hello'"
hello
real 0m1.944s
user 0m1.511s
sys 0m0.138s
nailgun:
~/NetBeansProjects/jruby $ time jruby -e "puts 'hello'"
hello
real 0m0.103s
user 0m0.006s
sys 0m0.009s
Obviously it's a substantial improvement.
Now there are a few issues with Nailgun that I've seen so far:
- it doesn't pass along CWD, so if I switch to another directory the
launched class on the remote server doesn't pick that up. Of course the
JVM only has one CWD anyway, but in JRuby we have one per JRuby
runtime...so we could implement our own wrapper around the Nailgun
server that's aware of this. But we'd still need to tweak the native
client to send it across.
- you obviously can't pass JVM flags across the wire, since the JVM is
already started up. This also applies to classpath...but JRuby will
generally use a runtime-dynamic classpath anyway, so that issue is lessened.
- I had some trouble with one Ruby app that uses a readline library; it
didn't appear to pipe correctly. The client needs better term support, I
would guess.
I'm debating trying to get Nailgun running again as a project, so these
issues can be resolved. In the absence of some other miracle, there's
not going to be a better way to get native-like startup times for those
of us implementing languages used heavily for small command-line
utilities. Nailgun seems like a 75% solution that could become something
pretty nice with a little work.
Thoughts on this? Other suggestions for defeating startup woes?
To try it out in JRuby:
1. check out JRuby trunk at http://svn.codehaus.org/jruby/trunk/jruby
1.5. build JRuby with "ant"
2. run 'make' from within bin/nailgun
3. start up a server with jruby-ng-server
4. instead of 'jruby' run 'jruby-ng'. -J options are not passed on.
- Charlie
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "JVM Languages" group.
To post to this group, send email to [EMAIL PROTECTED]
To unsubscribe from this group, send email to
[EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/jvm-languages?hl=en
-~----------~----~----~----~------~----~------~--~---
---------------------------------------------------------------------
To unsubscribe from this list please visit:
http://xircles.codehaus.org/manage_email