Performance Unterschiede/Probleme zwischen XP und Vista

Slice

Grünschnabel
Hallo zusammen,

ich bin Java-Neuling und bin an ein Problem gestoßen, bei dessen Lösung ich Euch bitten wollte.

Ich habe anhand einiger Anleitungen, die ich unter anderem in diesem Forum gefunden habe (Danke!) folgendes Mini-Programm geschrieben und als Runnable-Jre exportiert.

Auf dem XP Rechner läuft der Counter ohne Probleme und regelmäßig.
Auf dem Vista-Notebook, fängt der Counter nach wenigen Sek. an zu hacken und der Ressourcen-Monitor zeigt eine sehr hohe Auslastung.

Ich habe schon mit den Begriffen "Vista, XP, Performance, SWT" gegoogled, aber leider nichts gefunden, was mit wirklich weiter geholfen hat.

Auf beiden Systemen habe ich die neueste Java-Version installiert.

Code:
package ACPackages;

import java.text.DecimalFormat;

import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;

public class PerformanceTest{
	
	private Shell sShell = null;  //  @jve:decl-index=0:visual-constraint="47,13"
	private myT sc = new myT();  //  @jve:decl-index=0:
	private Button btStart = null;  //  @jve:decl-index=0:visual-constraint="233,23"
	private Composite composite = null;
	private Label label = null;
	  
	/**
	 * This method initializes composite	
	 *
	 */
	private void createComposite() {
		GridData gridData = new GridData();
		gridData.grabExcessHorizontalSpace = true;
		gridData.horizontalAlignment = GridData.FILL;
		composite = new Composite(sShell, SWT.NONE);
		composite.setLayout(new FillLayout());
		composite.setLayoutData(gridData);
		label = new Label(composite, SWT.NONE);
		label.setFont(new Font(Display.getDefault(), "Tahoma", 10, SWT.NORMAL));
		label.setText("Label");
	}

	public static void main(String[] args) {
		org.eclipse.swt.widgets.Display display = org.eclipse.swt.widgets.Display.getDefault();
		PerformanceTest thisClass = new PerformanceTest();
		thisClass.createSShell();
		
		thisClass.sShell.open();
		
		while (!thisClass.sShell.isDisposed()) 
		{
			if (!display.readAndDispatch())
				display.sleep();
		}
		display.dispose();
	}

	public void createSShell() {
		GridLayout gridLayout = new GridLayout();
		gridLayout.numColumns = 2;
		sShell = new Shell();
		sShell.setLayout(gridLayout);
		sShell.setSize(new Point(310, 95));
		btStart = new Button(sShell, SWT.NONE);
		btStart.setText("Starten");
		createComposite();
	
		btStart
		.addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() {
			public void widgetSelected(
					org.eclipse.swt.events.SelectionEvent e) {
							Thread counterThread = new Thread(sc, "Clock");
					counterThread.start();
				}
			});
		
		sShell.addListener(SWT.Close, new Listener() {
			public void handleEvent(Event event) {
				System.exit(0);
		      }
		});

	}
	
	class myT extends Thread
	{
		private volatile boolean running = true;
		final DecimalFormat fmt = new DecimalFormat("00.000");
		double elapsedSecs;
		String zwischenzeit;
		long startTime = System.currentTimeMillis();
		
		public void run()
		{
			while (running) 
			{
				sShell.getDisplay().asyncExec(new Runnable() 
				{
					public void run() 
					{
							if (label.isDisposed())
								return;
							elapsedSecs = (System.currentTimeMillis() - startTime) / 1000.0;
							zwischenzeit = fmt.format(elapsedSecs);
							label.setText(zwischenzeit);
							try 
							{
								Thread.sleep(100);
							} catch (InterruptedException e) 
							{
								e.printStackTrace();
							}
			        }//run
				});//runnable

			}//while
		} // run
	}//class

}

Entwicklungsumgebung ist:
Eclipse SDK, Version: 3.5.1 mit dem Visual Editor

Der Dell-PC läuft mit XP, Intel Pentium 3GHz, 1GB RAM

Das ASUS-Notebook läuft unter VistaPremium, Athlon64 mit 4GB RAM.


Für eine Idee, Tipp oder einen Hinweis auf einen Fehler wäre ich sehr dankbar!

Dank und viele Grüße
Michael
 
Zuletzt bearbeitet:
Was mir auffällt ist, du machst immer ein new Runnable().

Kannst du das Runnable nicht einmal erstellen und immer wieder mitgeben, damit das nicht immer neu erstellt werden muss?

Das wird aber vermutlich nicht der Grund für das Problem sein, ist nur eine kleine Verbesserung.
 
Hallo,
ich mag wirklich nichts falsches sagen, aber ein Bekannter hatte mal ein ähnliches Problem mit Schleifen/Threads.

Sein "Problem" war auf die Systemarchitektur (x86, x64) zurückzuführen.
Das 64 Bit System durchlief Schleifen schneller als das 32 Bit Systeme.

Vielleicht hängt es damit in irgendeiner Form zusammen...
Wäre nett wenn sich hierzu noch jemand anders äußern würde, meine Antwort basiert nämlich eher auf Vermutungen.

Gruß,
Jens
 
Erster Fehler: Du hast das Sleep im asyncExec gemacht. Damit legst du den GUI-Thread schlafen.

Zweites Problem: Berechnungen immer außerhalb des asyncExec ausführen und nur für den Zugriff auf SWT-Elemente verwenden.

Es reicht dann in deinen Thread eine Implementierung von Runnable zu übergeben:

Java:
import java.text.DecimalFormat;
import java.util.concurrent.TimeUnit;

import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;

public class PerformanceTest {

	private Shell sShell = null; // @jve:decl-index=0:visual-constraint="47,13"

	private myT sc = new myT(); // @jve:decl-index=0:

	private Button btStart = null; // @jve:decl-index=0:visual-constraint="233,23"

	private Composite composite = null;

	private Label label = null;

	/**
	 * This method initializes composite
	 */
	private void createComposite() {
		GridData gridData = new GridData();
		gridData.grabExcessHorizontalSpace = true;
		gridData.horizontalAlignment = GridData.FILL;
		composite = new Composite(sShell, SWT.NONE);
		composite.setLayout(new FillLayout());
		composite.setLayoutData(gridData);
		label = new Label(composite, SWT.NONE);
		label.setFont(new Font(Display.getDefault(), "Tahoma", 10, SWT.NORMAL));
		label.setText("Label");
	}

	public static void main(String[] args) {
		org.eclipse.swt.widgets.Display display = org.eclipse.swt.widgets.Display.getDefault();
		PerformanceTest thisClass = new PerformanceTest();
		thisClass.createSShell();

		thisClass.sShell.open();

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

	public void createSShell() {
		GridLayout gridLayout = new GridLayout();
		gridLayout.numColumns = 2;
		sShell = new Shell();
		sShell.setLayout(gridLayout);
		sShell.setSize(new Point(310, 95));
		btStart = new Button(sShell, SWT.NONE);
		btStart.setText("Starten");
		createComposite();

		btStart.addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() {
			public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
				Thread counterThread = new Thread(sc, "Clock");
				counterThread.start();
			}
		});

		sShell.addListener(SWT.Close, new Listener() {
			public void handleEvent(Event event) {
				System.exit(0);
			}
		});

	}

	class myT implements Runnable {
		private volatile boolean running = true;

		final DecimalFormat fmt = new DecimalFormat("00.000");

		long startTime = System.currentTimeMillis();

		public void run() {
			while (running) {
				final double elapsedSecs = (System.currentTimeMillis() - startTime) / 1000.0;
				final String zwischenzeit = fmt.format(elapsedSecs);

				sShell.getDisplay().asyncExec(new Runnable() {
					public void run() {
						if (label.isDisposed())
							return;

						label.setText(zwischenzeit);

					}// run
				});// runnable

				try {
					TimeUnit.MILLISECONDS.sleep(100);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}

			}// while
		} // run
	}// class

}
 
Zurück