Performances with gcj

Benjamin de Dardel <[email protected]>
Newsgroups gmane.comp.gcc.java.devel
Message-ID <[email protected]>
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
PipeTest.java (text/x-java, 2.6 KB)
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);
			}
		}
	}
}
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.