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
Lange dauerndes Java Programm
![]() Anmeldungsdatum: Beiträge: 489 Wohnort: bochum, germany |
|
||
Anmeldungsdatum: Beiträge: 830 |
Moin, Selbst geschrieben? Dann nimm Perl oder Python. Sowas macht man nicht mit Java. Nur meine persönliche meinung. Grüsse, juribel |
||
(Themenstarter)
![]() Anmeldungsdatum: Beiträge: 489 Wohnort: bochum, germany |
Ebenfalls Moin, |
||
Anmeldungsdatum: Beiträge: 830 |
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 |
||
Projektleitung
Anmeldungsdatum: Beiträge: 12426 |
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.
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. |
||
(Themenstarter)
![]() Anmeldungsdatum: Beiträge: 489 Wohnort: bochum, germany |
Hallo rklm, |
||
Projektleitung
Anmeldungsdatum: Beiträge: 12426 |
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. |
||
![]() Anmeldungsdatum: Beiträge: 17410 Wohnort: Berlin |
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? |
||
(Themenstarter)
![]() Anmeldungsdatum: Beiträge: 489 Wohnort: bochum, germany |
Hallo user_unkown, |
||
Anmeldungsdatum: Beiträge: 227 |
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 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. |
||
Projektleitung
Anmeldungsdatum: Beiträge: 12426 |
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. |
||
![]() Anmeldungsdatum: Beiträge: 17410 Wohnort: Berlin |
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 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++. |
||
(Themenstarter)
![]() Anmeldungsdatum: Beiträge: 489 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.
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. |
||
(Themenstarter)
![]() Anmeldungsdatum: Beiträge: 489 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. |
||
Anmeldungsdatum: Beiträge: 3320 |
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? |