Java vs. C. Performance-Vergleich
-
Das haben wir mal an unserer FH programmiert:
/* bubblesort.c */ #include <stdlib.h> #include <stdio.h> #include <time.h> int main(int argc, char *argv[]) { int *a; int i = 0; int j = 0; int tmp = 0; const int arraysize = atoi(argv[1]); srand(time(NULL)); a = (int *) malloc(arraysize * sizeof(int)); if (!a) return 1; for (i = 0; i < arraysize; ++i) { a[i] = rand(); } /* Zahlen sortieren */ for (i = arraysize; i > 1; i--) { /* groessten Wert nach hinten schieben */ for (j = 0; j < i - 1; ++j) { if (a[j] > a[j + 1]) { /* Werte tauschen */ tmp = a[j + 1]; a[j + 1] = a[j]; a[j] = tmp; } } } free(a); return 0; }
// Bubblesort.java import java.util.Scanner; import java.util.Random; public final class Bubblesort { private Bubblesort() { } /** * main ist der Startpunkt des Programms. * @param args wird nicht verwendet. */ public static void main(final String[] args) { final Scanner stdin = new Scanner(System.in); final Random random = new Random(); //----------------------------------------------- Feldgroesse einlesen final int n = Integer.parseInt(args[0]); //---------------------------------------------------- Zahlen einlesen final int[] a = new int[n]; for (int i = 0; i < a.length; ++i) { a[i] = random.nextInt(); } //--------------------------------------------------- Zahlen sortieren for (int i = a.length; i > 1; i--) { // groessten Wert nach hinten schieben for (int j = 0; j < i - 1; ++j) { if (a[j] > a[j + 1]) { // Werte tauschen int tmp = a[j + 1]; a[j + 1] = a[j]; a[j] = tmp; } } } } }
Gemessen wurde mit dem Unix-Tool "time". Das bedeutet soweit ich weiss, dass auch die VM-Ausführungszeit von Java gemessen wird.
Folgendes kam raus:[steffo@localhost aufgabe2]$ time java Bubblesort 10000 real 0m1.554s user 0m1.100s sys 0m0.494s [steffo@localhost aufgabe2]$ time ./bubblesort 10000 real 0m1.653s user 0m1.631s sys 0m0.018s
Relevant ist hier nur die User-Zeit, wo Java gut eine halbe Sekunde schneller ist.
Wenn jedoch mit GCC -O kompiliert wird, sieht es wieder ganz anders aus:
[steffo@localhost aufgabe2]$ time ./bubblesort 10000 real 0m0.667s user 0m0.660s sys 0m0.004s
Hier ist C knapp 1 Sekunde schneller als Java.
Liebe Grüße
Steffo
-
Niemanden interessiert es, wie schnell oder langsam unoptimierter Code ist. Erst Recht nicht nach einem Jahr. Mach aus -O mal -O3 -march=native und staune. Du könntest sogar eine Laufzeit von ca. 0 bekommen.
-
@Steffo: Sortier mal ein größeres Array, damit Du nicht nur den Startup der VM misst. Mach es einfach 10 mal so groß. Und dann gib am Ende irgendetwas aus dem Array aus, damit das nicht alles wegoptimiert wird.
-
Gregor schrieb:
@Steffo: Sortier mal ein größeres Array, damit Du nicht nur den Startup der VM misst. Mach es einfach 10 mal so groß. Und dann gib am Ende irgendetwas aus dem Array aus, damit das nicht alles wegoptimiert wird.
[steffo@localhost aufgabe2]$ time ./bubblesort 100000 a[0]=670 real 1m17.174s user 1m17.112s sys 0m0.026s [steffo@localhost aufgabe2]$ time java Bubblesort 100000 a[0]=-2147458265 real 1m47.629s user 1m47.539s sys 0m0.875s
Eine Laufzeit von 0 ist das natürlich nicht, aber C bleibt ungeschlagen.
Liebe Grüße
Steffo
-
Und was lernen wir daraus?
1. Mit dem richtigen Algorithmus (z.B. Mergesort) kann man viel mehr raus holen, als mit der Programmiersprache.
2. C++ ist die Englische Küche unter den Programmiersprachen.
-
time ./bubblesorttest 100000
real 0m18.808s
user 0m18.687s
sys 0m0.030sC++ mit folgendem Code:
#include <vector> #include <algorithm> #include <utility> #include <cstdlib> int main(int argc, char** argv) { std::vector<int> v(std::atoi(argv[1])); std::generate(v.begin(), v.end(), std::rand); for(int i = v.size(); i > 1; --i) for(int j = 0; j < i - 1; ++j) if(v[j] > v[j + 1]) std::swap(v[j], v[j + 1]); return 0; }
Und folgendem Aufruf:
g++ -O3 -march=native -Wall -c -fmessage-length=0 -MMD -MP -MF"main.d" -MT"main.d" -o "main.o" "../main.cpp"
-
314159265358979: Toll, auf diese Weise kann ich jede Sprache gegen jede gewinnen lassen. Ich muss nur noch meinen Pentium II suchen.
-
Wie bitte?
-
Du vergleichst Ausführungszeiten von unterschiedlichen Computern.
-
Falsch, ich vergleiche noch gar nichts. Und wenn du nicht so unglaublich blöd wärst, hättest du dir denken können, dass das Resultat mit Java gleich kommt. Aber hauptsache gleich mal auf PI drauf, dabei hast du ja nichts zu befürchten, richtig?
-
314159265358979 schrieb:
Falsch, ich vergleiche noch gar nichts. Und wenn du nicht so unglaublich blöd wärst, hättest du dir denken können, dass das Resultat mit Java gleich kommt. Aber hauptsache gleich mal auf PI drauf, dabei hast du ja nichts zu befürchten, richtig?
Soso, dass meine Glaskugel aber auch immer noch nicht richtig funktioniert. Muss wohl an meiner grenzenlosen Dummheit liegen.
Nettigkeiten kannst du dir sparen.
-
Wenn du deine Denkweise mal ändern würdest, würde das schon helfen.
-
314159265358979 schrieb:
Wenn du deine Denkweise mal ändern würdest, würde das schon helfen.
Ist es mein Fehler, wenn ich nicht erkenne, dass mindestens 25 Minuten später ein Post kommt, der deinen vorherigen legitimiert? Ich denke nicht.
-
314159265358979 schrieb:
time ./bubblesorttest 100000
real 0m18.808s
user 0m18.687s
sys 0m0.030sBei mir etwas langsamer als C.
[stefano@localhost aufgabe2]$ time ./bubblesort-cpp 100000 real 1m18.260s user 1m18.184s sys 0m0.041s
-
@Steffo: Nö, eine Minute schneller. C kommt gleich, momentchen.
-
314159265358979 schrieb:
@Steffo: Nö, eine Minute schneller. C kommt gleich, momentchen.
Wie meinen? Ich rede von meinem System. Da hat das C-Programm ca. 1m17s gebraucht.
-
314159265358979 schrieb:
@Steffo: Nö, eine Minute schneller.
ROFL
Weswegen hast du mich noch gleich beleidigt?
-
Michael E. schrieb:
314159265358979 schrieb:
@Steffo: Nö, eine Minute schneller.
ROFL
Weswegen hast du mich noch gleich beleidigt?
Genau das meine ich. Ignoranter Trottel.
-
314159265358979 schrieb:
Michael E. schrieb:
314159265358979 schrieb:
@Steffo: Nö, eine Minute schneller.
ROFL
Weswegen hast du mich noch gleich beleidigt?
Genau das meine ich. Ignoranter Trottel.
Bitte noch 30 Minuten warten mit dem Riesenstreit! Muß Chips und Cola kaufen.
-
Geht's noch?! Nie gelernt wie man anständig mit Menschen umgeht?!
Wenn ihr nicht aufpasst, wird der Thread noch wegen euch geschlossen!