Code Optimieren

Status
Nicht offen für weitere Antworten.

sanv

Mitglied
Hallo,

ich versuche gerade den folgenden Code zu optimieren. Kann mir jemand dabei bitte weiterhelfen. Es handelt sich dabei um ein "Spiel" wo speziell dieser Bereich langsam ist und der Rest sollte nicht geandert werden.

Java:
 public int[] bearbeiteRahmen(final double x,  final double y, final double z) {
                if (sp_object==null) 
			sp_object= Frame.getSpObject();

                final Vector<Integer> erg = new Vector<Integer>();

                Thread t = new Thread(new Runnable() { 
			public void run() 	{
                        	for (int i=0 ; i<sp_object.length/2 ; ++i) {
                                	synchronized (erg) {
                                        	if (sp_object[i].schnitt(new MDaten(x,y,z))) {
                                                	erg.add(i);
                                        	}
                                	}
                        	}
                	}
		});

                t.start();

                for (int i=sp_object.length/2; i<sp_object.length ; ++i) {
                        synchronized (erg) {
                                if (sp_object[i].schnitt(new MDatenx,y,z))) {
                                        erg.add(i);
                                }
                        }
                }

                t.join();

                int[] daten = new int[erg.size()];

                for (int i=0 ; i<erg.size() ; ++i) {
                        daten [i] = erg.get(i);
                }
                Arrays.sort(daten);
                return daten;
        }

Das erste was ich zum optimieren gemacht habe ist folgendes:

Anstatt jedes mal eine neue Instanz von MDaten zu generien mache ich das hier:

MDaten object1 = new MDaten(x,y,z);

Und dieses "object1" gebes ich als parameter in die schnitt methode.

Was kann ich sonst noch machen ob den code zu optimieren/schneller zu machen.

Danke im Vorraus.
 
B

bygones

Gast
niemals code optimieren wenn man nicht stichhaltige beweise hat dass man unter performance leidet.

nie

lieber code verstaendlicher schreiben und besser
 

objcler

Aktives Mitglied
Vector ist böse.
Es mal ohne einen zweiten Thread probieren.
Rausfinden was genau in der Methode langsam ist und das dann optimieren.
 

objcler

Aktives Mitglied
niemals code optimieren wenn man nicht stichhaltige beweise hat dass man unter performance leidet.

nie

lieber code verstaendlicher schreiben und besser

Er schrieb doch: "Es handelt sich dabei um ein "Spiel" wo speziell dieser Bereich langsam ist " - ich nehme an, dass der Bereich so langsam ist, dass das Spiel keinen Sinn mehr macht. Sonst ist jeder Optimierungsversuch erstmal unnötig.
 

sanv

Mitglied
danke fuer die schnellen antworten.

das ist der code den ich so bekommen habe, ich hab diesen nicht selber geschrieben.

wenn ich alles in einem thread mache ist es um einiges schneller. zB:

Java:
 final Vector<Integer> erg = new Vector<Integer>();
 
  for (int i=0 ; i<sp_object.length/2 ; ++i) {
          if (sp_object[i].schnitt(new MDaten(x,y,z))) {
                  erg.add(i);
          }
   }
 
               
 for (int i=sp_object.length/2; i<sp_object.length ; ++i) {
        if (sp_object[i].schnitt(new MDatenx,y,z))) {
                 erg.add(i);
        }
  }
 
  int[] daten = new int[erg.size()];
 
  for (int i=0 ; i<erg.size() ; ++i) {
           daten [i] = erg.get(i);
  }
  Arrays.sort(daten);
  return daten;

Sollte es nicht schneller sein wenn ich >2 threads hab und das Spiel zB auf einem multi-core system lauft?

Danke im Vorraus.
 

objcler

Aktives Mitglied
danke fuer die schnellen antworten.

das ist der code den ich so bekommen habe, ich hab diesen nicht selber geschrieben.

wenn ich alles in einem thread mache ist es um einiges schneller. zB:

Java:
 final Vector<Integer> erg = new Vector<Integer>();
 
  for (int i=0 ; i<sp_object.length/2 ; ++i) {
          if (sp_object[i].schnitt(new MDaten(x,y,z))) {
                  erg.add(i);
          }
   }
 
               
 for (int i=sp_object.length/2; i<sp_object.length ; ++i) {
        if (sp_object[i].schnitt(new MDatenx,y,z))) {
                 erg.add(i);
        }
  }
 
  int[] daten = new int[erg.size()];
 
  for (int i=0 ; i<erg.size() ; ++i) {
           daten [i] = erg.get(i);
  }
  Arrays.sort(daten);
  return daten;

Sollte es nicht schneller sein wenn ich >2 threads hab und das Spiel zB auf einem multi-core system lauft?

Danke im Vorraus.

Wenn du nur einen Thread hast kannst du auch gleich noch die zweite for-Schleife killen und alles in einem Durchgang machen. Dann wirds noch schneller.

Threads bedeuten nicht gleich kürzere Laufzeiten. Jeder Thread erzeugt auch erstmal einen Verwaltungsaufwand, den man nicht unterschätzen sollte. Außerdem musst du locken (synchronized), was auch alles Zeit kostet.

Grundregel: Erstmal alles synchron, ohne Threads programmieren. Das ist meist am einfachsten und am elegantesten. Wenn du dann feststellst, dass das ein Problem ist (Performancetechnisch, ...) dann kannst du immernoch auf Threads umstellen.
 

tfa

Top Contributor
ich verstehe auch nicht warum der entwickler hier synchronisiert..

Das ist ja auch falsch.
Es wird Vector.add synchronisert, was es aber schon ist. Noch schlimmer allerdings, dass auch die if-Bedingung, wo gar nichts mir erg gemacht wird, synchronisiert wird. Das macht es nochmal langsamer.
Ich würde beide Threads jeweils eigene Ergebnislisten erzeugen lassen und die dann am Ende zusammenführen.
 

objcler

Aktives Mitglied
ich verstehe auch nicht warum der entwickler hier synchronisiert..

Bedenke bitte noch, dass die Grundregeln aller Grundregeln beachtet werden muss:

Probleme werden erstmal möglichst elegant und einfach gelöst.
Das Programm wird erstmal fertig gemacht.
Dann macht man Performancetests und optimiert zielgenau.

Es macht oft keinen Sinn rein mathematische Rechenoperationen zu optimieren. Jedenfalls nicht in Applikationen, die zum Beispiel irgendwas zeichnen (Spiele) oder viel IO-Erzeugen. Es kostet viel mehr Zeit ein Kreis zu zeichnen als eine extrem komplizierte Berechnung durchzuführen. Dann sollte man sich eventuell eher dauf das Zeichnen selbst konzentrieren. (Muss ich überhaupt zeichnen, kann ich den Region of Interest einschränken?, Caching?, ...).
 

sanv

Mitglied
d.h. eine loesung waere zB einen thread zu machen und die zwei for schleifen in 1 zu schreiben:

Java:
for (int i=0 ; i<sp_object.length ; ++i) {
          if (sp_object[i].schnitt(new MDaten(x,y,z))) {
                  erg.add(i);
          }
   }
 

objcler

Aktives Mitglied
d.h. eine loesung waere zB einen thread zu machen und die zwei for schleifen in 1 zu schreiben:

Java:
for (int i=0 ; i<sp_object.length ; ++i) {
          if (sp_object[i].schnitt(new MDaten(x,y,z))) {
                  erg.add(i);
          }
   }

Kein Thread.

Streiche das Wort am besten aus deinem Wortschatz :)
 

sanv

Mitglied
Das ist ja auch falsch.
Es wird Vector.add synchronisert, was es aber schon ist. Noch schlimmer allerdings, dass auch die if-Bedingung, wo gar nichts mir erg gemacht wird, synchronisiert wird. Das macht es nochmal langsamer.
Ich würde beide Threads jeweils eigene Ergebnislisten erzeugen lassen und die dann am Ende zusammenführen.

Hab jetzt eine 2. Verision geschrieben mit threads wo ich 2 Ergebnislisten erzeugen lasse :

Java:
 Thread thread = new Thread(new Runnable() { public void run() {
                        for (int i=0 ; i<sp_object.length/2 ; ++i)
                        {
                            if (sp_object[i].schnitt(daten))
                                    teil1.add(i);
                        }
                }});
                thread.start();

                for (int i=sp_object.length/2; i<sp_object.length ; ++i)
                {
                        if (sp_object[i].schnitt(daten))
                                teil2.add(i);
                }
                thread.join();

                erg.addAll(teil1);
                erg.addAll(teil2);

Aber die Loesung mit einer for-schleife ist noch immer am schnellsten?

Die Vorgabe ist die Laufzeit bist zu 99% zu reduzieren.
 

objcler

Aktives Mitglied
Hab jetzt eine 2. Verision geschrieben mit threads wo ich 2 Ergebnislisten erzeugen lasse :

Java:
 Thread thread = new Thread(new Runnable() { public void run() {
                        for (int i=0 ; i<sp_object.length/2 ; ++i)
                        {
                            if (sp_object[i].schnitt(daten))
                                    teil1.add(i);
                        }
                }});
                thread.start();

                for (int i=sp_object.length/2; i<sp_object.length ; ++i)
                {
                        if (sp_object[i].schnitt(daten))
                                teil2.add(i);
                }
                thread.join();

                erg.addAll(teil1);
                erg.addAll(teil2);

Aber die Loesung mit einer for-schleife ist noch immer am schnellsten?

Die Vorgabe ist die Laufzeit bist zu 99% zu reduzieren.

Wie kann man so eine Vorgabe machen? Das ist irgendwie komisch. Wie gesagt: Es gibt tools mit denen man das Laufzeitverhalten extrem detailliert beobachten und bewerten kann. Du solltest dich vielleicht erstmal auf die Analyse stürzen.

Google: dtrace

Vielleicht ist der Algorithmus selbst nicht das Problem sondern andere Dinge auf die du eher wenig Einfluss hast. Aber wir sollten hier nicht weiter Vermutungen aufstellen sondern die Werkzeuge benutzen, die uns die Antwort geben können.
 

sanv

Mitglied
Also ich habe den Code mal mit dem Profiler in NetBeans "untersucht" und folgendes Ergbnisse erhalten:

screen.jpg


Die Klasse "SchnelleVersion" ist jene die ich "optimiert" habe in dem ich 2 Threads wie oben beschrieben verwende.
 

Ark

Top Contributor
1. Was genau macht dieses [c]schnitt(daten)[/c]? (Code!)
2. Du sortierst [c]erg[/c] zum Schluss. Muss diese Sortierung zwingend vorgenommen werden? Wenn ja: Könnte eventuell ein TreeSet<Integer> angebracht sein?

Ark
 

sanv

Mitglied
1. Was genau macht dieses [c]schnitt(daten)[/c]? (Code!)
2. Du sortierst [c]erg[/c] zum Schluss. Muss diese Sortierung zwingend vorgenommen werden? Wenn ja: Könnte eventuell ein TreeSet<Integer> angebracht sein?

Ark

zu 1. die schnitt-methode macht folgendes:

Java:
public boolean schnitt (MDaten zentrum) 
{
    return zentrum.sub(wert).length() < abstand;
}

wert ist nochmals ein Objekt vom Typ MDaten.

zu 2. Der Rueckgabewert der methode ist int[].
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Ohne jetzt zu wissen, wie DAS (z.B "ab") alles implementiert ist:
Code:
private abstandSquared = abstand * abstand;
...

public boolean schnitt (MDaten zentrum) 
{
    return zentrum.ab(wert).lengthSquared() < abstandSquared;
}
DAS sind Sachen, die wirklich was bringen (können). Und das ist keine "premature optimization".
 

tfa

Top Contributor
Ohne jetzt zu wissen, wie DAS (z.B "ab") alles implementiert ist:
Code:
private abstandSquared = abstand * abstand;
...

public boolean schnitt (MDaten zentrum) 
{
    return zentrum.ab(wert).lengthSquared() < abstandSquared;
}
DAS sind Sachen, die wirklich was bringen (können). Und das ist keine "premature optimization".

Warum "squared"? Wenn a²<b² gilt automatisch a<b.

@TS: Wie oft wird die Schleife denn durchlaufen?
 

Ark

Top Contributor
Und was macht dieses [c]sub(wert)[/c]? Was ist überhaupt [c]wert[/c]? Wo kommt es her? Welche Programmteile sind noch am zu optimierenden Code beteiligt? (Lass dir doch bitte nicht alles aus der Nase ziehen. ;) )

Ark
 

sanv

Mitglied
also, wie gesagt ich sollte "nur" den code den ich im ersten post angeben habe optimieren und den rest nicht "anfassen".

mir wurde geraten eventl. Java's executor fuer mehrere threads zu verwenden? ist das ratsam?
 
J

JohannisderKaeufer

Gast
Hast du auch daran gedacht einen Unit-Test zu schreiben?

Es wäre ja äußerst Schade wenn das ganze schneller läuft aber ein anderes, bzw. falsches Ergebnis rauskommt.

Hier könnte auch die Annotation
@Test(timeout = 1000)
von interesse sein.
 

sanv

Mitglied
also das ergebnis passt da es in einer anderen klasse verglichen wird. der inhalt des int[] (rueckgabewert der methode) wird mit der berechnung der original klasse verglichen und der inhalt passt.
 

sanv

Mitglied
Mit

Java:
  Thread t = new Thread(new Runnable() {....

werden ja mehrere Threads erzeugt (wie aus dem NetBeans Profiler ersichtlich wird). Kann man das zB mit ExecutorService "optimieren". Kann mir jemand eventl. bitte ein Bspl geben.

Danke im Vorraus.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Code optimieren Allgemeine Java-Themen 7
P Code optimieren Allgemeine Java-Themen 9
M Code optimieren Allgemeine Java-Themen 10
M Unsicher, ob das Code richtig ist Allgemeine Java-Themen 4
MarvinsDepression Unbekanntes Zeichen in fremden Code wirft Fragen auf Allgemeine Java-Themen 4
schemil053 Methoden Code-Verbesserung Allgemeine Java-Themen 2
D Webarchive (war): Code verschleiern Allgemeine Java-Themen 7
D Compiler-Fehler child process exited with code 1 Allgemeine Java-Themen 1
Queenman Interface Mein Microsoft Visual Studio Code zeigt komische Dinge & Menüs an Allgemeine Java-Themen 9
A Clean Code: Variable vs. Methode Allgemeine Java-Themen 8
berserkerdq2 Versteht jemand, was diese beiden Zahlen bei dem IJVM Code zu bedeuten haben? Allgemeine Java-Themen 10
OnDemand Releaseversion Tag in Code Allgemeine Java-Themen 5
ERlK JDA Code funktioniert nicht? Allgemeine Java-Themen 4
F Code auslagern Allgemeine Java-Themen 5
D VBA Code mit Java ausführen möglich? Allgemeine Java-Themen 10
N JAVA-Code mit Grafikfenster zeichnet in Windows, aber nicht Mac. Allgemeine Java-Themen 4
JordenJost Unverständlicher Java code? Allgemeine Java-Themen 21
V Hilfe mit Java Code Allgemeine Java-Themen 4
S Processing Java Code verstehen Allgemeine Java-Themen 4
A code wird nicht ausgeführt Allgemeine Java-Themen 3
B Bitte um Code Erklärung Allgemeine Java-Themen 5
N nicht einsehbarer Fehler im code, kann nicht mehr übersetzten Allgemeine Java-Themen 51
N Regulären Ausdruck in normalen Java-Code umwandeln Allgemeine Java-Themen 12
OnDemand Clean Code oder Allgemeine Java-Themen 5
Noahscript Aus einem byte Array Steuerungszeichen und Code bekommen und ersetzen Allgemeine Java-Themen 3
J Simple Date Format Alternativen bitte um Code Allgemeine Java-Themen 14
AGW in Java-Code plötzlich ein paar Wörter in Rot Allgemeine Java-Themen 2
L Best Practice Auslagerung von Code = Performance Optimierung? Allgemeine Java-Themen 4
H Precompilierten code ansehen Allgemeine Java-Themen 3
R Wo müsste ich im Code eine Änderung vornehmen? Allgemeine Java-Themen 6
L Ausgabe von in Echtzeit ausgeführten Code Allgemeine Java-Themen 9
Drachenbauer Wie kann ich die menge an code reduzieren? Allgemeine Java-Themen 28
Thallius Warum ist dieser Code OS abhängig? Allgemeine Java-Themen 10
S Code Erklärung Allgemeine Java-Themen 21
B Pausem im Code Allgemeine Java-Themen 2
T Java-Quiz Code Fehler Allgemeine Java-Themen 10
L Eclipse Java Code ausführen Allgemeine Java-Themen 18
F Java Code ausführen direkt nach Anmelden in Windows Allgemeine Java-Themen 2
F Code in Klassen bringen Allgemeine Java-Themen 4
S Gibt es eigentlich Java Source Code Interpreter..? Allgemeine Java-Themen 13
J JUnit - Auslassen von Code Allgemeine Java-Themen 25
F Klassen Spaghetti Code Vermeidung Allgemeine Java-Themen 16
C code oder Bibliotheken für 2-Center Problem Allgemeine Java-Themen 4
J Code Page characters darstellen Allgemeine Java-Themen 12
J wie sollte man sinnvoll seinen Code aufteilen Allgemeine Java-Themen 6
I Python Code in Java Code Allgemeine Java-Themen 9
M Java (GUI) Code verdoppeln oder anzeige mehrmals anzeigen? Allgemeine Java-Themen 8
N Wie öffne ich einen runtergeladadenen Code in IntelliJ Allgemeine Java-Themen 3
R Fehler im Code Allgemeine Java-Themen 1
R Fehler im Code Allgemeine Java-Themen 3
O Standard library nativer C code Allgemeine Java-Themen 1
R Wo ist mein Fehler in diesem Code Allgemeine Java-Themen 7
S Java Editor Bekomme bei der Code-Vervollständigung die Zeichen &#8203; Allgemeine Java-Themen 3
N Morse Code decoder Allgemeine Java-Themen 9
O Erste Schritte Benzinverbrauch Code Hilfe Allgemeine Java-Themen 3
S Eclipse exit code 805306369 Allgemeine Java-Themen 1
Pataraca Vererbung Code einbinden Allgemeine Java-Themen 3
Developer_X Website HTML Code von HTTPS URL laden Allgemeine Java-Themen 0
S Wie kann ich eine kleine Stelle in meinem Code mit multiplen Threads abarbeiten..? Allgemeine Java-Themen 20
S Code 'innerhalb' des synchronen Bereichs einer BlockingQueue ausfuehren..? Allgemeine Java-Themen 7
F Verständlichkeitsproblem bei Java Code?! Allgemeine Java-Themen 2
G Eclipse Eclipse: Unreachable code Allgemeine Java-Themen 16
P Java Android Code in IOS compilieren? Allgemeine Java-Themen 9
C Code vereinfachen Allgemeine Java-Themen 2
T Hilfe bei Code Allgemeine Java-Themen 3
R Java-Code für folgene Aufgabe? Allgemeine Java-Themen 8
Prafy Best Practice Code Refaktorisierung Allgemeine Java-Themen 7
WetWer Was bedeutet/macht ein Exit-Code Allgemeine Java-Themen 1
D Code für bereitgestellte Methoden Allgemeine Java-Themen 1
perlenfischer1984 HTML Code decodieren Allgemeine Java-Themen 2
C ASCII-Code in Java Allgemeine Java-Themen 1
J Java-Code in DLL packen Allgemeine Java-Themen 5
J LWJGL 3 Error Code 1282 Allgemeine Java-Themen 4
0 Code startet nicht (Keine Warnung/Fehlermeldung) Allgemeine Java-Themen 4
A Frage zu meinem Code Allgemeine Java-Themen 2
B Code generierung Velocity Templates Telosys Allgemeine Java-Themen 1
E Fehlermeldung vor dem Programm code Allgemeine Java-Themen 1
B JAVA - mehrere Clienten gleichzeitig starten. Nicht bei Code! Allgemeine Java-Themen 3
Fischkralle Ausführen von fremden Code Allgemeine Java-Themen 14
wolfgang63 Code snipped Software Allgemeine Java-Themen 1
L Eclipse Editieren des Code templates für Override methods Allgemeine Java-Themen 2
J Java code "plugin" fähig machen Allgemeine Java-Themen 4
alderwaran .jar Code Signing, User-Keystore und Fragen dazu Allgemeine Java-Themen 0
Thallius Wie verstecke ich meinen private Key am besten im Code? Allgemeine Java-Themen 10
A Thread: Code paralell ausführen in mehreren Instanzen Allgemeine Java-Themen 1
B NullPointerException - Aber kein Fehler im Code Allgemeine Java-Themen 4
N HTTP response code: 403 Allgemeine Java-Themen 3
D Code bitte mit 19 stelligen Zahlen kompatibel machen Allgemeine Java-Themen 5
D Java Compiler code referencen Allgemeine Java-Themen 0
B Fehler im Java-Code Allgemeine Java-Themen 4
A PHP-Code zu Java-Code Allgemeine Java-Themen 5
M Code läuft unter windows aber nicht unter Linux Allgemeine Java-Themen 6
X Was macht folgender Code!? Allgemeine Java-Themen 6
K Code zu einem Projekt entschluesseln Allgemeine Java-Themen 15
H Java Leistungssteigerung durch Code Anpassung Allgemeine Java-Themen 5
Fab1 Best Practice Vorgehensweise bestehenden Code/Programm verschönern Allgemeine Java-Themen 4
A jEditorPane Html Datei öffnen (code) Allgemeine Java-Themen 3
S EAN-Code Tabelle für CD's Allgemeine Java-Themen 2
T Code durch eigenes Frame pausieren (ähnlich JDialog) Allgemeine Java-Themen 4
J Erzeugung von Java-Code Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben