public inbox for java@gcc.gnu.org
 help / color / mirror / Atom feed
From: Benjamin de Dardel <benjamin.dedardel@gmail.com>
To: java@gcc.gnu.org
Subject: Performances with gcj
Date: Sun, 10 Aug 2008 18:17:00 -0000	[thread overview]
Message-ID: <489F309D.3050609@gmail.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 1189 bytes --]

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

[-- Attachment #2: PipeTest.java --]
[-- Type: text/x-java, Size: 2658 bytes --]


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);
			}
		}
	}
}

             reply	other threads:[~2008-08-10 18:17 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-08-10 18:17 Benjamin de Dardel [this message]
2008-08-11  4:10 ` David Daney
2008-08-12 19:10   ` Benjamin de Dardel
2008-08-10 18:30 ffileppo
2008-08-10 21:34 ` Performances " Benjamin de Dardel

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=489F309D.3050609@gmail.com \
    --to=benjamin.dedardel@gmail.com \
    --cc=benjamin.de-dardel@laposte.net \
    --cc=java@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).