Re: Why is Java so slow????
Java Performance Export wrote:
I'm wondering if anyone can help me understand why my Java is being
very slow compared to an equivalent program written in "C".
I'm simply trying to print out the first N integers like
"This is line <nnnn>"
as a simple benchmark.
My Java version is over 60 times slower than my "C" version and I
would like to establish a lower bound on how long the very fastest
Java version could take, by applying every possible performance
speedup availalbe in the Java environment.
I've profiled with "-Xrunhprof" and looked at the output (below) and
was surprised by what I saw. Over 50 different methods are involved
before I arrive at the point where 80% of the cumulative CPU usage for
the run is accounted for! What the heck is this stuff?????
Is this really happening, and is there a way to get around it?
My client is threatening to implement in "C" and I am trying to talk
him out of it.
I'd be very curious to see how this equivalent benchmark peforms on
others' environments.
I modified the Java benchmark in accordance with others' suggestions and for
five million lines of output came up with:
Java:
$ java -server -cp build/classes testit.TimePrin
Elapsed: 93.966 secs.
C program:
$ ./timepr
Elapsed: 88.000000 secs.
A far cry from 60:1, eh?
AMD-64 ~2 GHz, 1 GB RAM, Linux Fedora 7, the usual mix of other programs
running. 32-bit Java.
Code with my variations follows.
<sscce name="TimePrin.java">
package testit;
public class TimePrin
{
private static final int LIM = 5000000;
public static void main( String [] args)
{
int lim;
if ( args.length < 1 )
{
lim = LIM;
}
else
{
try
{
lim = Integer.parseInt( args [0] );
}
catch ( NumberFormatException ex )
{
lim = LIM;
}
}
long start = new Date().getTime();
for ( int i=0; i < lim; i++)
{
System.out.print( "This is line " + i +"\n" );
}
long end = new Date().getTime();
double elapsed = (end - start) / 1000.0;
System.out.println( "Elapsed: "+ elapsed +" secs." );
}
}
</sscce>
<sscce name="timepr.c" build="gcc -O4 -o timepr timepr.c" >
#include <stdio.h>
#include <time.h>
#define LIM 5000000
int main(int argc, char ** argv)
{
int lim;
if ( argc < 2 )
{
lim = LIM;
}
else
{
lim = atoi(argv[1]);
if ( lim <= 1000 )
{
lim = LIM;
}
}
int i;
time_t start = time( NULL );
for ( i=1; i <= lim; i++ )
{
printf("this is line %d\n", i);
}
time_t end = time( NULL );
printf( "Elapsed: %f secs.\n", difftime( end, start ));
}
</sscce>
--
Lew