This is a comparison of mops running on Parrot (-O6 on an Athlon 700) versus Java JDK 1.4.0 beta 2 jitted and interpreted. You can see that Parrot performance is very comparable to Java in interpreted mode.
I've attached mops.class and mops.ksm, some disassembly output from Kopi. mops.class was generated automatically by Parrot2Java which I will make available once I fix a few more bugs :-). -Kevin $ test_prog mops.pbc Iterations: 100000000 Estimated ops: 300000000 Elapsed time: 14.766181 M op/s: 20.316695 $ java -version java version "1.4.0-beta2" Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.0-beta2-b77) Java HotSpot(TM) Client VM (build 1.4.0-beta2-b77, mixed mode) $ java mops Iterations: 100000000 Estimated ops: 300000000 Elapsed time: 0.6059999465942383 M op/s: 495.0495485783799 $ java -Xint mops Iterations: 100000000 Estimated ops: 300000000 Elapsed time: 10.911999940872192 M op/s: 27.49266877067277
mops.class
Description: Binary data
// compiler version: 45.3 @source "mops.pbc" public class mops extends java.lang.Object { /** * main * * @stack 20 * @locals 12 */ public static void main(java.lang.String[]) { _L0: @const 0 @istore 1 @const 1 @istore 2 @const 100000000 @istore 3 @getstatic java.io.PrintStream java.lang.System.out @const "Iterations: " @invokevirtual void java.io.PrintStream.print(java.lang.String) @getstatic java.io.PrintStream java.lang.System.out @iload 3 @invokevirtual void java.io.PrintStream.print(int) @getstatic java.io.PrintStream java.lang.System.out @const "\n" @invokevirtual void java.io.PrintStream.print(java.lang.String) @const 3 @istore 4 @iload 3 @iload 4 @imul @istore 5 @getstatic java.io.PrintStream java.lang.System.out @const "Estimated ops: " @invokevirtual void java.io.PrintStream.print(java.lang.String) @getstatic java.io.PrintStream java.lang.System.out @iload 5 @invokevirtual void java.io.PrintStream.print(int) @getstatic java.io.PrintStream java.lang.System.out @const "\n" @invokevirtual void java.io.PrintStream.print(java.lang.String) @invokestatic long java.lang.System.currentTimeMillis() @l2d @const 1000.0D @ddiv @dstore 6 _L35: @iload 1 @iload 3 @if_icmpeq _L43 @iload 1 @iload 2 @iadd @istore 1 @goto _L35 _L43: @invokestatic long java.lang.System.currentTimeMillis() @l2d @const 1000.0D @ddiv @dstore 8 @dload 8 @dload 6 @dsub @dstore 10 @getstatic java.io.PrintStream java.lang.System.out @const "Elapsed time: " @invokevirtual void java.io.PrintStream.print(java.lang.String) @getstatic java.io.PrintStream java.lang.System.out @dload 10 @invokevirtual void java.io.PrintStream.print(double) @getstatic java.io.PrintStream java.lang.System.out @const "\n" @invokevirtual void java.io.PrintStream.print(java.lang.String) @iload 5 @i2d @dstore 6 @dload 6 @dload 10 @ddiv @dstore 6 @const 1000000.0D @dstore 10 @dload 6 @dload 10 @ddiv @dstore 6 @getstatic java.io.PrintStream java.lang.System.out @const "M op/s: " @invokevirtual void java.io.PrintStream.print(java.lang.String) @getstatic java.io.PrintStream java.lang.System.out @dload 6 @invokevirtual void java.io.PrintStream.print(double) @getstatic java.io.PrintStream java.lang.System.out @const "\n" _L82: @invokevirtual void java.io.PrintStream.print(java.lang.String) @return @var 0: args java.lang.String[] [ _L0, _L82] @var 1: i2 int [ _L0, _L82] @var 2: i3 int [ _L0, _L82] @var 3: i4 int [ _L0, _L82] @var 4: i1 int [ _L0, _L82] @var 5: i5 int [ _L0, _L82] @var 6: d1 double [ _L0, _L82] @var 8: d5 double [ _L0, _L82] @var 10: d2 double [ _L0, _L82] } }