Open Thought (09.03.2015), Sky.NET (10.03.2015)
Thema: Performance Java und C
-
04.03.2015, 14:47 #1
Performance Java und C
Tag,
ich habe einen naiven Ansatz, um alle Primzahlen unter einer gegebenen Grenze zu ermitteln, jeweils in C und in Java implementiert. Mir ist bekannt, dass es schnellere Verfahren für Primzahlen gibt, darum geht es mir hier aber nicht.
Hier sind die Programme:
Spoiler:Java
Spoiler:C
In der Java API Dokumentation zur ArrayList heißt es:
As elements are added to an ArrayList, its capacity grows automatically. The details of the growth policy are not specified beyond the fact that adding an element has constant amortized time cost.
Ergebnis:
Limit Primzahlen Java C (Faktor 2) C (Faktor 1.5 100.000.000 5.761.455 126,08s 321,68s 322,22s 10.000.000 664.579 4,80s 12,12s 12,09s 1.000.000 78.498 0,19s 0,48s 0.48s 100.000 9.592 0,01s 0,02s 0.02s
Ich bin, wenn überhaupt, nur ein durchschnittlicher Programmierer, also überrascht es mich nicht wirklich, dass ich es nicht schaffe, ein Programm in C zu schreiben, das schneller als sein Java-Pendant läuft. Mich würde aber interessieren, wer von euch es schafft, und wie das C-Programm und die gesetzten Flags des Compilers aussehen, ohne einen anderen Algorithmus für die Primzahlen zu verwenden.
-
The Following 2 Users Say Thank You to Nuebel For This Useful Post:
-
04.03.2015, 15:43 #2
AW: Performance Java und C
Hatte gerade mal Lust das Ganze in C#.NET und PHP auszuprobieren. Die Ergebnisse sind auf meinem komischen Arbeitsrechner leider nicht so überragend
Limit Primzahlen C#.NET PHP 100.000.000 5.761.455 716,531s n/a 10.000.000 664.579 26,136s 254,823s 1.000.000 78.498 1,031s 9,869s 100.000 9.592 0,048s 0,392s
Spoiler: Source in C#.NET
Spoiler:Source in PHPGeändert von Snees (04.03.2015 um 16:19 Uhr) Grund: PHP ergänzt
-
The Following User Says Thank You to Snees For This Useful Post:
Sky.NET (10.03.2015)
-
11.03.2015, 12:21 #3
- Registriert seit
- 01.03.2013
- Beiträge
- 48
Thanked 5 Times in 3 PostsAW: Performance Java und C
Also ich selbst bin zwar quasi vom Fach (Anwendungsentwickler) aber habe mich da noch nicht so 100% mit beschäftigt und würde mich da wohl erst in ein paar Jahren (nach meinem Studium) qualifiziert genug fühlen um darauf eine gute Antwort geben zu können.
Aber alles in allem gilt für mich immer noch das ein guter Programmcode in C/C++/C# schneller läuft als in Java. Der Grund dafür, Java versucht ein schweizer Taschenmesser zu sein. Soll heißen, es läuft auf "jedem" system, aber auch wenn dein taschenmesser eine säge hat, wirst du damit keine Bäume fellen und ein Floss draus bauen können.
Java ist so darauf versessen überall zu funktionieren das es zwar genau das tut, aber eben auch nur das. Es "funktioniert" eben. Wie gut ist da die andere Frage.
Gruß: Sanrasaa
-
11.03.2015, 12:47 #4
AW: Performance Java und C
Warum tust du es dann?
Ein richtig guter C/C++ programmierer wird sein Programm immer ressourcensparender hinbekommen wie C#, geschweige denn Java. Besonders Java ist ein Monster was Ressourcen angeht, C# geht ja noch.
Das ist nichts worüber man diskutieren muss oder Meinungen haben kann, denn es ist eine Tatsache! Schau dir z.B. Robotik/Mikrocontroller an, da wird fast ausschließlich C und Assembler eingesetzt weil es dort auf Schnelligkeit ankommt. Entwickelt man ein Fertigsystem geht es auch um Geld. Braucht man mehr Speicher wird ein größerer Chip nötig, der kostet dann ein paar Cent mehr. Klingt nicht viel aber dadurch wird der Endpreis teurer oder das geht sogar vom Gewinn ab. Ist ja auch kein Wunder, bei Java/c# kommt eine weitere Schicht dazu die es dort nicht gibt. Gegenüber Assembler fallen sogar 2 weg.
Aber durch die Frameworks wird halt vieles einfacher und die Programme laufen auf allen wichtigen Betriebssystemen. Wenn man bedenkt dass selbst Office Kisten heutzutage 2 Kerne und mindestens 4Gig Ram haben, ist weniger Aufwand und mehr Flexibilität höher zu gewichten ob das Programm ein paar MB mehr oder weniger Ram braucht. Außerdem brauchst du einen sehr guten und erfahrenen Programmierer, der auch ordentlich Zeit aufwenden muss für die Optimierungen und teilweise prozessorspezifische Flags setzen muss! Einfach drauf los programmieren machts nicht schneller. Sieht man ja bei Nuebel wie sein C Progrämmchen sogar langsamer ist als Java, weil der compiler besser automatisch optimiert wie er, weil ihm halt die Erfahrung und das Fachwissen fehlt.
Man braucht viel Ahnung um Leistung rauskitzeln zu können. Hab das mit Webservern auch schon gesehen als ich als Neuling einen nginx aufsetzen wollte weil der ja besonders performant sein soll. Wirklich schneller als der Apache lief er aber nicht. Nachdem ein Kollege der sich seit einigen Jahren intensiver damit beschäftigt kurz davor saß, ging das Teil ab wie Schmids Katze
Stell dir das bei Software wie Jdownloader oder Minecraft vor die auf 9287349823 verschiedenen Systemen laufen sollen. Dazu noch Windows/Linux. Unfassbar viel Aufwand, das würde sich nicht lohnen.
Snees Benchmark ist übrigens für die Katz weil die Implementierungen in den Sprachen verschieden sind und außerdem in .NET ineffizient gecastet wird, 'as' ist performanter! Hat mich schon gewundert dass .NET so lahm sein soll obwohl es meiner Erfahrung nach eher schneller als Java ist, das dürfte mit vernünftigem Code sicher besser sein, da beide Sprachen von der Architektur vergleichbar sind.
-
11.03.2015, 12:50 #5
AW: Performance Java und C
Zitat von Sanrasaa
Zum Beispiel im Eingangspost die Programme mit der Primzahlbestimmung unter einer gegeben Grenze. Unter der Grenze 100.000.000 gibt es 5.761.455 Primzahlen, die in einem Array gespeichert werden. Das Java-Programm wurde damit 195,6 Sekunden früher fertig als das C-Programm. "Um sicherzustellen", dass die Java-ArrayList das tut, was auch im C-Programm geschieht (wenn Größe gleich Kapazität, dann verdopple Kapazität), habe ich die ArrayList durch eine eigene Klasse ersetzt:
class DynamicArray<T> {
private static final int reallocFactor = 2;
private Object[] data;
private int capacity;
private int size;
public DynamicArray(int initialCapacity) {
capacity = initialCapacity;
data = new Object[capacity];
size = 0;
}
public DynamicArray() { this(1); }
public void add(T object) {
if (size == capacity) {
extendArray();
}
data[size] = object;
++size;
}
@SuppressWarnings("unchecked")
public T get(int index) {
return (T) data[index];
}
public int capacity() { return capacity; }
public int size() { return size; }
private void extendArray() {
capacity *= reallocFactor;
Object[] tmp = new Object[capacity];
for (int i = 0; i < size; ++i) {
tmp[i] = data[i];
}
data = tmp;
}
}
überraschender Weise war das sogar noch ein Tickchen schneller als die ArrayList aus der Standardbibliothek.
Wie bereits im Eingangspost erwähnt, wäre ich dankbar, wenn ein pfiffiger C/C++-Programmierer seinen performanten Code hier vorstellen würde. Ich schaff's nicht.
-
11.03.2015, 13:47 #6
-
11.03.2015, 14:02 #7
- Registriert seit
- 26.10.2011
- Beiträge
- 1.196
- Blog Entries
- 2
Thanked 1.596 Times in 725 Posts
Ähnliche Themen
-
Abends erhebliche Performance-Probleme auf Youtube
Von Casper <3 im Forum Internet und TechnikAntworten: 17Letzter Beitrag: 23.02.2015, 22:04 -
Bringen 16GB RAM statt 8GB einen Performance Schub beim zocken?
Von Sido im Forum HardwareAntworten: 13Letzter Beitrag: 23.03.2014, 01:35 -
Win7 Java in Safari ausführen (Fehlermeldung Java nicht installiert)
Von Silverstar im Forum WindowsAntworten: 8Letzter Beitrag: 02.12.2013, 23:41 -
Debian Squeeze & Apache2, Performance verbessern und absichern
Von Snees im Forum Server-AdministrationAntworten: 13Letzter Beitrag: 03.07.2013, 16:08 -
ASRock Fatal1ty P67 Performance - gut oder anderes?
Von Devon im Forum KaufberatungAntworten: 1Letzter Beitrag: 06.01.2013, 19:12
Diese Seite nutzt Cookies, um das Nutzererlebnis zu verbessern. Klicken Sie hier, um das Cookie-Tracking zu deaktivieren.