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


  • Mod

    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.030s

    C++ 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.030s

    Bei 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!


Anmelden zum Antworten