garbage collection take too much time to execute....

- - <[email protected]>
Newsgroups gmane.comp.gcc.java.devel
Message-ID <[email protected]>
Hi,
I found a strange behaviour on code generated by gcj when compare its output with code generated by eclipse.

Mainly the code generated by gcj  take too much time to  perform a memory  garbage collection (about 5 seconds) instead of only 15 milliseconds of byte code generated by eclipse.

The problem seems to happens when there are canvas and transform operations. I attach a simple snippet code that write a vertical text on canvas in order to reproduce the behaviour.

The gcj compiler I use is:
$ gcj --version
gcj.exe (GCC) 3.4.5 (mingw-vista special r3)
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
with the swt version 3349:  "swt-gdip-win32-3349.dll"  and  "swt-win32-3349.dll"
 
I'm new of this discussion list, hoping not annoy you. It is a trouble or it is just a mistake on usage of transform?
thanks you,

x10

Here is the code....

-------------------------
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Transform;

public class snippet {

	private Shell sShell = null;  //  @jve:decl-index=0:visual-constraint="10,10"
	private Button button = null;
	private Canvas canvas = null;

	/**
	 * This method initializes canvas	
	 *
	 */
	private void createCanvas() {
		GridData gridData = new GridData();
		gridData.horizontalAlignment = org.eclipse.swt.layout.GridData.FILL;
		gridData.grabExcessHorizontalSpace = true;
		gridData.grabExcessVerticalSpace = true;
		gridData.verticalAlignment = org.eclipse.swt.layout.GridData.FILL;
		canvas = new Canvas(sShell, SWT.BORDER);
		canvas.setLayoutData(gridData);
		canvas.addPaintListener(new org.eclipse.swt.events.PaintListener() {
			public void paintControl(org.eclipse.swt.events.PaintEvent e) {
				System.out.println("paintControl()"); // TODO Auto-generated Event stub paintControl()
				GC gc = e.gc;

				int xVertical = 200;
				int yVertical = 200;
				Transform t = new Transform(gc.getDevice());
				t.translate(xVertical, yVertical);
				t.rotate(-90f);
				gc.setTransform(t);

				gc.drawText("Vertical Text",0,0);

				t.rotate(90f);
				t.translate(-xVertical, -yVertical);
				gc.setTransform(t);
				t.dispose();
			
			}
		});
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		/* Before this is run, be sure to set up the launch configuration (Arguments->VM Arguments)
		 * for the correct SWT library path in order to run with the SWT dlls. 
		 * The dlls are located in the SWT plugin jar.  
		 * For example, on Windows the Eclipse SWT 3.1 plugin jar is:
		 *       installation_directory\plugins\org.eclipse.swt.win32_3.1.0.jar
		 */
		Display display = Display.getDefault();
		snippet thisClass = new snippet();
		thisClass.createSShell();
		thisClass.sShell.open();

		while (!thisClass.sShell.isDisposed()) {
			if (!display.readAndDispatch())
				display.sleep();
		}
		display.dispose();
	}

	/**
	 * This method initializes sShell
	 */
	private void createSShell() {
		GridData gridData1 = new GridData();
		gridData1.horizontalAlignment = org.eclipse.swt.layout.GridData.CENTER;
		sShell = new Shell();
		sShell.setText("Shell");
		sShell.setSize(new Point(579, 365));
		sShell.setLayout(new GridLayout());
		button = new Button(sShell, SWT.NONE);
		button.setText("Press me to redraw the canvas");
		button.setLayoutData(gridData1);
		button.addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() {
			public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
				System.out.println("widgetSelected()"); // TODO Auto-generated Event stub widgetSelected()

				canvas.redraw();		
				System.err.println("start");
				long before = System.currentTimeMillis();
				System.gc();
				long after = System.currentTimeMillis();
				System.err.println("Elapsed milliseconds: " + (after-before));
				System.err.println("end");
			}
		});
		createCanvas();
	}

}
----------------------------










The java code attached is
snippet.java (text/x-java, 3.3 KB)
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Transform;

public class snippet {

	private Shell sShell = null;  //  @jve:decl-index=0:visual-constraint="10,10"
	private Button button = null;
	private Canvas canvas = null;

	/**
	 * This method initializes canvas	
	 *
	 */
	private void createCanvas() {
		GridData gridData = new GridData();
		gridData.horizontalAlignment = org.eclipse.swt.layout.GridData.FILL;
		gridData.grabExcessHorizontalSpace = true;
		gridData.grabExcessVerticalSpace = true;
		gridData.verticalAlignment = org.eclipse.swt.layout.GridData.FILL;
		canvas = new Canvas(sShell, SWT.BORDER);
		canvas.setLayoutData(gridData);
		canvas.addPaintListener(new org.eclipse.swt.events.PaintListener() {
			public void paintControl(org.eclipse.swt.events.PaintEvent e) {
				System.out.println("paintControl()"); // TODO Auto-generated Event stub paintControl()
				GC gc = e.gc;

				int xVertical = 200;
				int yVertical = 200;
				Transform t = new Transform(gc.getDevice());
				t.translate(xVertical, yVertical);
				t.rotate(-90f);
				gc.setTransform(t);

				gc.drawText("Vertical Text",0,0);

				t.rotate(90f);
				t.translate(-xVertical, -yVertical);
				gc.setTransform(t);
				t.dispose();
			
			}
		});
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		/* Before this is run, be sure to set up the launch configuration (Arguments->VM Arguments)
		 * for the correct SWT library path in order to run with the SWT dlls. 
		 * The dlls are located in the SWT plugin jar.  
		 * For example, on Windows the Eclipse SWT 3.1 plugin jar is:
		 *       installation_directory\plugins\org.eclipse.swt.win32_3.1.0.jar
		 */
		Display display = Display.getDefault();
		snippet thisClass = new snippet();
		thisClass.createSShell();
		thisClass.sShell.open();

		while (!thisClass.sShell.isDisposed()) {
			if (!display.readAndDispatch())
				display.sleep();
		}
		display.dispose();
	}

	/**
	 * This method initializes sShell
	 */
	private void createSShell() {
		GridData gridData1 = new GridData();
		gridData1.horizontalAlignment = org.eclipse.swt.layout.GridData.CENTER;
		sShell = new Shell();
		sShell.setText("Shell");
		sShell.setSize(new Point(579, 365));
		sShell.setLayout(new GridLayout());
		button = new Button(sShell, SWT.NONE);
		button.setText("Press me to redraw the canvas");
		button.setLayoutData(gridData1);
		button.addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() {
			public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
				System.out.println("widgetSelected()"); // TODO Auto-generated Event stub widgetSelected()

				canvas.redraw();		
				System.err.println("start");
				long before = System.currentTimeMillis();
				System.gc();
				long after = System.currentTimeMillis();
				System.err.println("Elapsed milliseconds: " + (after-before));
				System.err.println("end");
			}
		});
		createCanvas();
	}

}
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.