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
// 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]
}
}