ubuntuusers.de

Lange dauerndes Java Programm

Status: Ungelöst | Ubuntu-Version: Server 22.04 (Jammy Jellyfish)
Antworten |

homer65

Avatar von homer65

Anmeldungsdatum:
8. November 2005

Beiträge: 574

Wohnort: bochum, germany

Hallo Zusammen,
habe ein Java Programm, das für eine einzelne Berechnung schon mal drei Tage braucht.
Es ist ein reines Rechenprogramm und macht kein IO. Es läuft auch parallel in mehreren Threads und nutzt die CPU zu 100%.
Die Frage ist, wie kann man es schneller machen?
Schnellere Hardware? ⇐ Das kostet
Schnellere Programmiersprache? ⇐ Gibt es die überhaupt. Aber bitte kein FORTRAN, würg
Mehr Gehirnschmalz ins Java Programm investieren? ⇐ Fällt mir auch schwer
Was meint Ihr?
Gruß Christian

juribel

Anmeldungsdatum:
20. April 2014

Beiträge: 1243

Moin,

Selbst geschrieben?

Dann nimm Perl oder Python. Sowas macht man nicht mit Java.

Nur meine persönliche meinung. Grüsse, juribel

homer65

(Themenstarter)
Avatar von homer65

Anmeldungsdatum:
8. November 2005

Beiträge: 574

Wohnort: bochum, germany

juribel schrieb:

Moin,

Selbst geschrieben?

Dann nimm Perl oder Python. Sowas macht man nicht mit Java.

Nur meine persönliche meinung. Grüsse, juribel

Ebenfalls Moin,
Vielen Dank für Deine Meinung.
Ja, ist selbstgeschrieben.
Perl? Hmh, kenn ich nicht wirklich. Aber Python? Das wird doch interpretiert und ist noch langsamer.
Gruß Christian

juribel

Anmeldungsdatum:
20. April 2014

Beiträge: 1243

Das ist ein Irrtum! Beide Sprachen sind Interpreter, das stimmt. Aber die zeitkritischen internen Routinen sind allesamt hochoptimiert in C geschrieben. Die Sprachen werden nicht so interpretiert, wie du das vielleicht noch von Batch-Skripten unter Windows kennst (Zeile für Zeile). Sie werden beim Aufruf eines Skripts intern in einen Bytecode kompiliert (Grössenordnung vielleicht 100 Millisekunden, also völlig irrelevant), und der Bytecode ist wirklich pfeilschnell.

Grüsse, juribel

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13174

juribel schrieb:

Moin,

Selbst geschrieben?

Dann nimm Perl oder Python. Sowas macht man nicht mit Java.

Nur meine persönliche meinung. Grüsse, juribel

Wir wissen nichts über die Art des Programms und Du bringst nicht mal ein Argument, warum das nun in Perl oder Python schneller sein soll. Das wird homer65 sicher nicht helfen.

homer65 schrieb:

Die Frage ist, wie kann man es schneller machen?

Schnellere Programmiersprache? ⇐ Gibt es die überhaupt. Aber bitte kein FORTRAN, würg
Mehr Gehirnschmalz ins Java Programm investieren? ⇐ Fällt mir auch schwer

Java ist nicht wirklich langsam, auch wenn sich der Mythos bei einigen hartnäckig hält. Wir wissen ja nicht, was Dein Programm macht, aber ich würde mal mit Profiling anfangen und schauen, was denn da so viel Zeit frisst. Parallel kann man sich auch den Code anschauen um festzustellen, ob die Datenstrukturen und der Ablauf für schelle Verarbeitung geeignet sind. Im schlimmsten Fall stellst Du fest, dass die Architektur ungeeignet ist und musst große Teile neu schreiben.

homer65

(Themenstarter)
Avatar von homer65

Anmeldungsdatum:
8. November 2005

Beiträge: 574

Wohnort: bochum, germany

Hallo rklm,
ja, das mit dem Profiling ist eine Idee.
Habe ich selbst aber noch nicht gemacht.
Kannst Du mir einen Profiler empfehlen?
Gruß Christian

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13174

homer65 schrieb:

Kannst Du mir einen Profiler empfehlen?

Boah, das ist alles schon so lange her. Java VisualVM ist frei. NetBeans Profiler scheint auch nicht schlecht zu sein, habe ich aber nie genutzt. Sonst schau mal

PS: Sei doch bitte etwas sparsamer mit den manuellen Zeilenumbrüchen.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17604

Wohnort: Berlin

homer65 schrieb:

Hallo Zusammen,
habe ein Java Programm, das für eine einzelne Berechnung schon mal drei Tage braucht.
Es ist ein reines Rechenprogramm und macht kein IO. Es läuft auch parallel in mehreren Threads und nutzt die CPU zu 100%.
Die Frage ist, wie kann man es schneller machen?
Schnellere Hardware? ⇐ Das kostet
Schnellere Programmiersprache? ⇐ Gibt es die überhaupt. Aber bitte kein FORTRAN, würg
Mehr Gehirnschmalz ins Java Programm investieren? ⇐ Fällt mir auch schwer

So allgemein kann man da wenig zu sagen, außer dass Perl & Python Dir sehr wahrscheinlich nicht weiterhelfen - eher wird es langsamer, außer sie hätten für die speziellen Anforderungen, die Du hast, von denen wir aber nichts wissen, spezialisierte Bibliotheken, die vielleicht leichter richtig zu benutzen sind.

Es gibt Programmierfehler, die einer schnellen Ausführung im Wege stehen, wie etwa wiederholte Stringverkettung mit + statt StringBuffer, die erheblich Zeit kosten können und leicht zu beheben sind.

Dann kann es sein, dass es bessere Algorithmen gibt, wie etwa die Gaußsche Summenformel, mit der sich eine Summe über eine Folge Ganzzahlen sehr viel schneller berechnen lässt, als über eine Schleife, aber das hängt sehr davon ab, was Dein Programm denn da berechnet.

Und allgemein eine schwierige Sache ist die Parallelisierung, die nicht immer möglich oder einfach ist, aber da, sagst Du, bist Du schon aktiv geworden. Hat das was gebracht, oder hast Du gleich damit angefangen und keine Vergleichswerte?

homer65

(Themenstarter)
Avatar von homer65

Anmeldungsdatum:
8. November 2005

Beiträge: 574

Wohnort: bochum, germany

Hallo user_unkown,
schön, das auch Du Dir Zeit nimmst. ☺ . Die Parallelisierung bringt auf meinem Rechner ungefähr einen Faktor 5. Habe 6 Rechenkerne. Und ja, es werden Summen von sehr vielen Summanden berechnet. Die Summanden sind Spuren von Matrizen.
Gruß Christian

Neral

Anmeldungsdatum:
3. Oktober 2007

Beiträge: 230

Ohne den Code zu sehen, kann man da nur allgemeine Sachen zu schreiben. Profilen ist ja schon genannt worden; dann wäre da noch als beliebtes Thema, was Java wirklich langsam (nicht nur gefühlt langsam) macht, ob du Arrays oder ArrayList<Integer> o. ä. für deine Matrizen benutzt. Letzteres ist gerne mal eine Größenordnung langsamer, JVM und Boxing sei dank.

Dann ist die Frage, ob du die Sachen selbst geschrieben hast oder eine der vielen Matrixbibliotheken benutzt, die es sicherlich auch für Java gibt.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13174

homer65 schrieb:

Und ja, es werden Summen von sehr vielen Summanden berechnet. Die Summanden sind Spuren von Matrizen.

Naja, da gibt es natürlich, je nach Sprache, optimierte und reichlich getestete Bibliotheken. Die sind auf jeden Fall besser als das, was man selbst so zusammenprogrammiert. Du hattest ja schon Fortran erwähnt... 😉

Ggf. lohnt sich auch, direkt auf ein entsprechendes Paket wie z.B. Matlab oder Alternativen wie z.B. GNU Octave zurückzugreifen.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17604

Wohnort: Berlin

homer65 schrieb:

Hallo user_unkown,
schön, das auch Du Dir Zeit nimmst. ☺ . Die Parallelisierung bringt auf meinem Rechner ungefähr einen Faktor 5. Habe 6 Rechenkerne. Und ja, es werden Summen von sehr vielen Summanden berechnet. Die Summanden sind Spuren von Matrizen.

Tja, Matritzenrechnung war nie meine Stärke, entsprechend habe ich auch keine Erfahrungen damit unter Java. Das müssen ja riesige Matrizen oder wahnsinnig viele sein, wenn das so lange dauert. ☺

Wenn die Werte aber keinen mathematischen Gesetzmäßigkeiten unterliegen, dann gibt es auch weniger wahrscheinlich algorithmische Tricks, die Berechnung zu beschleunigen.

Zu Java und langsam: Ja, für Programme wie sort ist Java ungeeignet, weil langsam, denn die Startupzeit der JVM, wenn sie noch nicht im Speicher ist, konnte schon mal 0.8s betragen, da waren die C-Programme 100x fertig, mit dem Programm, was aber drastischer klingt, als es ist, denn Wartezeiten unter 0,2-0,3s nimmt man interaktiv eh nicht wahr. 0,8s aber dann doch.

Für Programme, die länger als ein paar 10-tel Sekunden laufen ist aber dieser Overhead vernachlässigbar. Weil es - einmal gestartet - so schnell ist, ist Java auf dem Server sehr beliebt. Je nach Benchmark auch mal schneller als C oder C++.

homer65

(Themenstarter)
Avatar von homer65

Anmeldungsdatum:
8. November 2005

Beiträge: 574

Wohnort: bochum, germany

Hallo Zusammen, habe mit VisualVM das Profiling gemacht. Leider weiss ich wirklich nicht was zu verbessern ist. Es ist der folgende Konstruktor der als Hauptlast Verursacher ausgemacht wird.

1
2
3
4
5
6
7
8
public Pauli(int n)
	{
		paulikette = new int[n];
		for (int i=0;i<n;i++)
		{
			paulikette[i] = 0;
		}
	}

Hierbei ist n immer 50. Die Matrizen haben die Dimension 2 hoch 50. Aufgrund ihrer speziellen Form lassen sie sich aber mit O(n) Schritten multiplizieren und auch die Spur ist O(n). Also noch nicht so dramatisch. Nur die Anzahl der Multiplikation ist gigantisch. Und für jede Multiplikation wird eine neue Matrix (Pauli) erzeugt. Hmh vielleicht kann ich das ständige Neuinitialisieren vermeiden. Mal nachdenken.

homer65

(Themenstarter)
Avatar von homer65

Anmeldungsdatum:
8. November 2005

Beiträge: 574

Wohnort: bochum, germany

Puh, das weglassen der ständigen Initialisierung hat die Laufzeit schon mal halbiert. Ein erster Erfolg ☺ . Werde mal weiter profilen. Danke für den Hinweis.

verdooft

Anmeldungsdatum:
15. September 2012

Beiträge: 4399

Ich hab mal was mit Zufallszahlen und Summen gemacht, da war C(++) super flott. Es spricht ja auch nichts dagegen, das einfach mal in verschiedenen Sprachen umzusetzen und dann die schnellste Variante zu verwenden?

Antworten |