I’ve spent the last week or so writing a customer emulation script for the QA group here to test some of our archiving products. If you’re unfamiliar with PHFOS/CIOSim, take a look here. In short, PHFOS/CIOSim is a small multi-threaded program that randomly selects files in a given directory to open and hold open.
I started out writing the script in Perl, which at this point is the scripting language I know the best, I then decided that now is as good a time as any to learn Ruby (which I’ve been interested in for a while now), so I re-wrote the entire program in Ruby (first *useful* script I’ve actually written in Ruby). Then, one day at work I was told that I needed to extend the program to support 5000 simultaneous threads doing disk I/O. I thought about this for a while and (after talking with my friend Jon about it) decided on using Java, as the threading was much more robust (something I had problems with using Ruby and Perl). Well, I’ve got working versions of all 3 programs and I thought I’d share my perspective on the pro’s and con’s of each one:
Java pro’s:
- Most robust thread implementation of the 3 languages
- Handles SMP much better than ruby
- Code is portable with minimum requirements to run
- OO language (a bigger pro to actual developers who this matters more to)
Java con’s:
- JVM overhead (not really that much nowadays)
- More difficult to read due to Java’s extreme verbosity
- Requires jdk 1.5+ (1.4 is still the only actual “supported” JDK in my company)
Ruby pro’s:
- Most readable code of all 3 (shortest too)
- I got to learn Ruby
- Ruby implementation available for most platforms
- More OO than Perl (not that I used OO…)
Ruby con’s:
- Ruby only took advantage of 1 of my CPU cores (Java used both)
- Ruby is slower than Perl (maybe one day they’ll be just as fast?)
- Almost no one in my department has heard of Ruby
Perl pro’s:
- Super-easy to install with ActiveState for windows, comes default with most *nix
- Super-easy to install the required module:
perl -MCPAN -e shell ; install File::Random
- Allows fine-grain tuning of thread parameters (adjustable thread stack size)
Perl con’s:
- If you don’t have threaded perl, gotta reinstall (/cry @ Solaris)
- Least readable code (unless you loooovvve punctuation)
- Perl doesn’t like me spawning millions of threads and detaching all of them
Overall, since I need code that’s portable to multiple platforms easily, while allowing for very large amounts of IO, I’ll probably stick to the java version (which was renamed CIOSim [Customer I/O Simulator] because you actually pronounce it :P), followed by the Ruby version (so easy to write), and then the Perl version, which, actually has the largest amount of features.
I haven’t written all the features into each version yet (except for the Perl one), but, if you’d like to take a look at them, here they are:
Java version
Ruby version
Perl version
Next tool I need to write, I’ll probably be looking at Ruby
Anyone out there use anything different for sysadmin tools? Python? Lisp? Assembler? Leave a comment and let me know
Jon Raphaelson wrote:
you want a fun time, try it with Erlang. I actually am going to try that out. You’ll be surprised speedwise.
Link | November 13th, 2007 at 4:28 pm