Welche Programmiersprache für das internet



  • achja, source:

    #include <cstdlib>
    #include <ctime>
    #include <iostream>
    #include <fstream>
    #include <algorithm>
    #include "apistr.h"
    #include <string>
    #include <cmath>
    #include <strstream>
    
    using namespace std;
    const int arrayLength=5000000;
    
    void i2s(int num, char*& result) //converts num to char* and append it to result
    {
        if(num) i2s(num/10, result),*result++=num%10+'0';
    }
    
    void int2str(int num, char* buffer)
    {
        char* t=buffer;
        i2s(num,t);
        *t=0;
    }
    
    int main()
    {
        srand((unsigned)time(NULL));
    
        clock_t times[7];
    
        int i;
    
        times[0]=clock();
        cout<<"0"<<endl;
        //Array erzeugen
        int* array = new int[arrayLength];
        double* doubleArray = new double[arrayLength];
        times[1]=clock();
        cout<<"1"<<endl;
        //Zufallszahlen erzeugen
        for(i=0;i<arrayLength; ++i)
        {
            array[i]=rand();
            doubleArray[i]=rand();
        }
        times[2]=clock();
        cout<<"2"<<endl;
        //Array sortieren
        sort(array,array+arrayLength);
    
        times[3]=clock();
        cout<<"3"<<endl;
    
        //ts::apistring stringBuffer(arrayLength*12);
        //char* buffer=stringBuffer.AsBuffer(arrayLength*12);
        string stringBuffer;
        stringBuffer.reserve(arrayLength*12);
    
        char buffer[15];
        for(i=0;i<arrayLength;++i)
        {
            int2str(array[i],buffer);
            stringBuffer.append(buffer);
            stringBuffer.append("\n");
        }
        //*buffer=0;
    
        times[4]=clock();
        cout<<"4"<<endl;
        ofstream writer("test.txt");
    
        if(writer.is_open())
        {
            writer<<stringBuffer;
        }
        else
            cout<<"FEHLER FEHLER FEHLER\n";
    
        times[5]=clock();
        cout<<"5"<<endl;
    
        // Wurzeln berechnen
        for (i = 0 ; i < arrayLength ; ++i)
        {
            doubleArray[i] = sqrt(doubleArray[i]);
        }
    
        times[6]=clock();
        cout<<"6"<<endl;
    
        cout<<"Array erzeugen : " << times[1]-times[0] << "ms"<<endl;
        cout<<"Zufallszahlen erzeugen : " << times[2]-times[1] << "ms" << endl;
        cout<<"Sortieren : " << times[3]-times[2] << "ms" << endl;
        cout<<"String (anhängen) : " << times[4]-times[3] << "ms" << endl;
        cout<<"Speichern : " << times[5]-times[4] << "ms" << endl;
        cout<<"Wurzeln berechnen : " << times[6]-times[5] << "ms" << endl;
    
    }
    


  • Zeig am Besten mal den Code! ...kannst ja deine String-Klasse gleich mitzeigen!

    EDIT : ...warst wohl schneller! 🙂

    [ Dieser Beitrag wurde am 25.10.2002 um 22:05 Uhr von Gregor editiert. ]



  • int * array = new int[arrayLength];
    double * doubleArray = new double[arrayLength];
    

    muss das sein?

    es macht das gleiche nur schneller

    int array[arrayLength];
    double doubleArray[arrayLength];
    


  • Dein Programm macht genau das gleiche, was die anderen Programme auch machen :

    Nicht das, was mein Programm macht! 😃 ...die erzeugte Datei ist nur 32,5 MB groß. Ist klar, dass das schneller geht. :p 🙂 Ich kriege beim Kompilieren übrigens 3 "Warnings". Kann aber sein, dass das an mir liegt.



  • dimah: schonmal was davon gehört das der stack nicht unendlich groß ist? 😃



  • Was für Warning sind denn das? Bestimmt wieder Newline am Ende der Datei vergessen 😃



  • Original erstellt von <Warner>:
    Was für Warning sind denn das? Bestimmt wieder Newline am Ende der Datei vergessen 😃

    2 C:\Dev-Cpp\include\c++\3.2\backward\backward_warning.h:32
    #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <sstream> instead of the deprecated header <strstream.h>. To disable this warning use -Wno-deprecated.

    9 C:\C++\C++Projects\Benchmark\Benchmark.cpp
    from Benchmark.cpp

    51 C:\Dev-Cpp\include\c++\3.2\backward\strstream
    In file included from C:/Dev-Cpp/include/c++/3.2/backward/strstream

    Naja! Nur beim ersten steht "Warning" dabei!



  • Original erstellt von <->:
    dimah: schonmal was davon gehört das der stack nicht unendlich groß ist? 😃

    ups 😞



  • @Gregor
    was ist den 32MB groß, doch nicht das Executable? Naja bei mir sieht es so aus

    kingruedi@host1# g++ -O3 -Wall -W -march=athlon -mcpu=athlon -fomit-frame-pointer -malign-double -fschedule-insns2 -pipe -std=c++98 -o benchmark benchmark.cc
    kingruedi@host1# ./benchmark
    0
    1
    2
    3
    4
    5
    6
    Array erzeugen : 0ms
    Zufallszahlen erzeugen : 1310000ms
    Sortieren : 1740000ms
    String (anhängen) : 2740000ms
    Speichern : 1050000ms
    Wurzeln berechnen : 210000ms
    kingruedi@host1# ls -lh benchmark
    -rwxr-xr-x    1 king     king          58k Oct 26 00:21 benchmark
    

    58kb vs. 32mb schon nen kleiner Unterschied 😉



  • Original erstellt von kingruedi:
    **@Gregor
    was ist den 32MB groß, doch nicht das Executable? Naja bei mir sieht es so aus
    **

    Nein! Die erzeugte Text-Datei! ...ist doch ein Indiz dafür, dass was mit dem String nicht stimmen kann, wenn meiner 20 MB länger ist, oder? ...bei mir ist der Code übrigens ansonsten tatsächlich deutlich flotter beim String-erzeugen, als die anderen C++-Programme. ...das Speichern ist aber noch nicht optimal, aber da müßte ich meinen Rechner mal neu starten, um das tatsächlich beurteilen zu können!



  • @Gregor:
    Jep, sorry mein Fehler. Die <strstream> Header sollte man nicht mehr verwenden - hab nur vergessen den include wieder rauszunehmen... ich verwende eh nichts aus strstream 🙂

    dann erklaer mal, was mein programm falsch macht!

    OK, ich habe insofern nen kleinen Bug, als dass meine int2str Funktion aus der Zahl 0 einen leerzen string macht...

    Wenn ich mir die datei aber ansehe: dann habe ich exakt 5000001 Zeilen 🙂 und in 5000000 Zeilen steht eine zahl (die ersten paar zeilen ausgenommen, da sollte 0 stehen, tut es aber nicht).

    Wie sieht die Ausgabe in Java aus? vielleicht

    00001
    00002
    00003

    oder warum ist deine Datei groesser 😕



  • Hmmm... ich weiß nicht, wo der Fehler liegt. Was ist denn die größte Zahl, die erzeugt wird? Bei mir ist es (bei dem Java-Programm) 2 Mrd. und etwas. ...und die kleinste -2 Mrd und etwas, aber das mit den negativen Zahlen ist egal, das macht nicht soviel aus. führende Nullen schreibe ich auch nicht mit.

    [ Dieser Beitrag wurde am 25.10.2002 um 22:44 Uhr von Gregor editiert. ]



  • OK, Bug ist behoben:
    int2str ist leicht geaendert worden:

    void int2str(int num, char* buffer)
    {
        char* t=buffer;
        if(num==0)
        {
            *buffer++='0';
            *buffer=0;
            return;
        }
        i2s(num,t);
        *t=0;
    }
    

    Schoen wenn du handoptimiert schneller bist als ich 🙂 aber ich habe einfach nicht die lust mich wirklich hinzusetzen und zu sagen, ich schreib die ganzen sachen haendisch...

    int2str musste ich haendisch schreiben, da die streams anscheinend verdammt lahm sind 😞



  • Original erstellt von Shade Of Mine:
    **
    Schoen wenn du handoptimiert schneller bist als ich 🙂 aber ich habe einfach nicht die lust mich wirklich hinzusetzen und zu sagen, ich schreib die ganzen sachen haendisch...
    **

    Ja, das ist ein echter Nachteil von Java. Viele Dinge sind so, wie sie vorgegeben sind einfach langsam. ...ist schon merkwürdig, dass man so einfach z.B. ein Sort schreiben kann, was schneller, als das vorgegebene ist. 😞 ...der Zufallsgenerator wird ein noch extremeres Beispiel sein.

    Naja : Einige Sachen sind auch schnell!



  • Original erstellt von Gregor:
    Hmmm... ich weiß nicht, wo der Fehler liegt. Was ist denn die größte Zahl, die erzeugt wird?

    Da haben wir das problem!
    bei mir ists 0 bis 32767

    Muesste man mal um faktor 68 erweitern - dann sollte es ungefaehr hinkommen...



  • Original erstellt von Gregor:
    Viele Dinge sind so, wie sie vorgegeben sind einfach langsam.

    Ist in C++ genauso... zB stringstream - das war n schock fuer mich, dass das so lahm ist... naja...

    Wir testen hier auch extremfaelle die nie wirklich vorkommen werden - deshalb sind die ergebnise ja auch verfaelscht...



  • Ich habe die Zufallszahlen jetzt mal mit 68 multipliziert. -> 41 MB! Langsam kommen wir dem Ziel näher! 🙂
    ...bei mir kommt jetzt eine ähnliche Performance zum Java-Programm heraus, was die Strings betrifft. ...bei allem, was davor ist, ist C++ schneller, beim Speichern wieder langsamer! Wurzeln sind wieder gleich. Es wundert mich, dass Java hier so gut abschneidet.



  • Ich denke eh, dass wir noch 3 Dinge in den Test mit einbeziehen sollten, wo ich mir aber eh sicher bin, dass C# und Java verlieren

    1. Gesamt Dauer des Programmes (C# und Java haben den Nachteil, dass das Jitten noch dazu kommt)
    2. Speicher Bedarf der Binarys (bei C# und Java kommt noch die VM+Jitter hinzu, also wird das deutlich größer)
    3. Arbeitsspeicher Bedarf (ich denke C# und Java haben da schlechte Karten, wegen der VM, die ja noch geladen werden muss)



  • Bei den Binaries würde ich die JVM bzw. das Framework nicht mitzählen. Die sind ja generell da und haben erstmal nichts mit dem eigentlichen Programm zu tun. ...da kann man ja gleich das ganze Betriebssystem mitzählen. ...oder man baut sich ne GUI und rechnet bei C++ irgendeine Grafikbibliothek dazu. sollte nicht kleiner als bei Java sein. Wenn man nur die kompilierten Programme betrachtet, dann ist C++ für Java, was die Größe betrifft kein Gegner. Bei C# weiß ich das nicht. Aber beim benötigten Arbeitsspeicher hat C++ einen deutlichen Vorteil. Bei der Gesamtlaufzeit kannst du beim Java-Programm noch maximal eine Sekunde draufrechnen. Länger dauert das nicht.

    ...ich bin ja froh, dass ihr nicht nen fiesen Test vorgeschlagen habt, wie :
    "Wir schreiben 25.000.000 ints in eine Hashtabelle!" ...da hätte Java bei weitem keine Chance! ...würde wahrscheinlich sogar nen Faktor 100 oder so ausmachen, weil ich für das Java-Programm nicht genug Arbeitsspeicher gehabt hätte.



  • Und was sagt einem das Ergebnis? Das so ein Test nichtmal annähernd auf Real-World Situationen übertragbar ist war ja schließlich hoffentlich vorher allen beteiligten klar.

    [Edit: der Fhelerteufel hat ein Wort geklaut]
    [PS: Nebenbei gesagt ist das ein ziemlich armer Test. Wer Programmiersprachen mittels Fortran-Programmen vergleicht muß sich nicht wundern, wenn Sprachen, die sich am Geist von Fortran orientieren, am besten abschneiden]

    [ Dieser Beitrag wurde am 25.10.2002 um 23:35 Uhr von Bashar editiert. ]


Anmelden zum Antworten