This is the mail archive of the
java@gcc.gnu.org
mailing list for the Java project.
Performances with gcj
- From: Benjamin de Dardel <benjamin dot dedardel at gmail dot com>
- To: java at gcc dot gnu dot org
- Date: Sun, 10 Aug 2008 20:17:01 +0200
- Subject: Performances with gcj
- Reply-to: benjamin dot de-dardel at laposte dot net
Hi all,
I had to release a program that executes an external process and gets
its standard output.
I implemented a solution with threads and pipes to redirect inputs and
outputs (cf PipeTest.java).
I choose the 'find /' command to test it.
I'm very surprised about gcj performances which are 5x slowly than sun jvm.
In fact, I expected that my compiled program would be faster than all jvm.
Do you have an idea about these differences ?
Is that the gnu classpath implementation which is quiet slow ?
Regards,
Benjamin
# test1 : bash
$ time find /
real 2m6.054s
user 0m5.260s
sys 0m6.990s
# test2 : compilation with gcj
$ gcj --main=PipeTest -o test.bin PipeTest.java
$ time test.bin
real 18m50.632s
user 4m56.380s
sys 8m31.940s
real 19m38.148s
user 5m9.660s
sys 9m44.710s
# test3: interpretation with gij
$ gcj -C PipeTest.java
$ time gij PipeTest
real 22m39.882s
user 6m7.580s
sys 10m26.350s
# test4 : interpretation with java
$ javac PipeTest.java
$ time java PipeTest
real 3m35.035s
user 1m18.710s
sys 0m11.730s
##### compilers #####
$ gcj --version
gcj (GCC) 4.2.3 (Ubuntu 4.2.3-2ubuntu6)
$ javac -version
javac 1.6.0_03
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
public class PipeTest {
public static void main(String args[]) {
System.out.println("START");
try { /* set up pipes */
PipedOutputStream pout1 = new PipedOutputStream();
PipedInputStream pin1 = new PipedInputStream(pout1);
PipedOutputStream pout2 = new PipedOutputStream();
PipedInputStream pin2 = new PipedInputStream(pout2);
/* construct threads */
Producer prod = new Producer(pout1);
Filter filt = new Filter(pin1, pout2);
Consumer cons = new Consumer(pin2);
/* start threads */
prod.start();
filt.start();
cons.start();
prod.join();
filt.join();
cons.join();
} catch (IOException e) {
System.out.println("Error1 : " + e.getMessage());
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("STOP");
}
}
class Producer extends Thread {
private DataOutputStream out;
public Producer(OutputStream os) {
out = new DataOutputStream(os);
}
public void run() {
try {
Process p1 = Runtime.getRuntime().exec("find /");
try {
InputStreamReader isr = new InputStreamReader(p1
.getInputStream());
BufferedReader br = new BufferedReader(isr);
String line = null;
while ((line = br.readLine()) != null) {
out.writeBytes(line + "\n");
out.flush();
}
} catch (IOException ioe) {
ioe.printStackTrace();
}
out.close();
} catch (Exception e) {
System.out.println("Error: " + e);
}
}
}
class Filter extends Thread {
private BufferedReader in;
private DataOutputStream out;
public Filter(InputStream is, OutputStream os) {
in = new BufferedReader(new InputStreamReader(is));
out = new DataOutputStream(os);
}
public void run() {
String s = "";
while (s != null) {
try {
s = in.readLine();
// TODO apply filters
out.writeBytes(s + "\n");
} catch (IOException e) {
System.out.println("Error: " + e);
}
}
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
class Consumer extends Thread {
private BufferedReader in;
public Consumer(InputStream is) {
in = new BufferedReader(new InputStreamReader(is));
}
public void run() {
String s = "";
while (s != null) {
try {
s = in.readLine();
if (s != null) {
System.out.println("LINE = " + s);
}
} catch (IOException e) {
System.out.println("Error: " + e);
}
}
}
}