Java vs. C#



  • besorg dir am besten den Cygnus C++, weil der ist wohl Unix kompatibel.



  • Also, ich habs mal für Windows umgeschrieben.

    #include <iostream>
    #include <cstdlib>
    #include <cmath>
    #include <cstring>
    #include <limits>
    #include <fstream>
    using namespace std;
    #include <windows.h>
    
    #ifdef _MSC_VER 
    #undef max
    #endif
    
    int myless(const void *a, const void *b)
    {
      return a<b;
    }
    
    int main()
    {
      DWORD times[7];  
      const size_t arrayLength=5000000;  
      size_t i=0;
    
      //Arrays erzeugen  
      times[0] = GetTickCount();
      int *intArray=new int[arrayLength];
      double *doubleArray=new double[arrayLength];
      times[1] = GetTickCount();
    
      //Zufallszahlen
      for(;i<arrayLength;++i)
      {
        intArray[i]=static_cast<int>(numeric_limits<int>::max()*rand()/RAND_MAX+1.0);
        doubleArray[i]=(numeric_limits<double>::max()*rand()/RAND_MAX+1.0);
      }
      times[2] = GetTickCount();
    
      //Sortieren
      qsort(static_cast<void*>(intArray),arrayLength,sizeof(int),myless);
      times[3] = GetTickCount();
    
      //int to char
      char strBuffer[10];
      char *stringBuffer = new char[arrayLength*11+1];
      for(i=0;i<arrayLength;++i)
      {
        sprintf(strBuffer,"%d\n",intArray[i]);
        strcat(stringBuffer,strBuffer);
      }
      times[4] = GetTickCount();
    
      //string in Datei schreiben
      ofstream out("demo.txt");
      if(!out.is_open())
      {
        cerr << "Fehler" << endl;
        return 1;
      }
      out << stringBuffer;
      out.close();
      times[5] = GetTickCount();
    
      //Wurzeln berechnen
      for(i=0;i<arrayLength;++i)
        doubleArray[i]=sqrt(doubleArray[i]);
      times[6] = GetTickCount();
    
      //Ausgabe:
      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;
    
      delete[] intArray;
      delete[] doubleArray;
      delete[] stringBuffer;
    
    }
    

    [Edit]Array auf dem Heap anstatt auf dem Stack[/Edit]

    [ Dieser Beitrag wurde am 08.10.2002 um 16:52 Uhr von thomas80d editiert. ]



  • thomas: Der Code ist fehlerhaft. Es entsteht eine unbehandelte Ausnahme. War vielleicht nur Glück das er bei dir funktionierte.



  • Ich bin auch wieder zu blöd, um den Code zu kompilieren. 🙄
    Zwei der Fehler, die vorher schon da waren, sind jetzt immer noch da :

    Benchmark.cpp:36: use of 'less' is ambiguous;
    Benchmark.cpp:11: first declared as 'int less(const void*, const void*)' here c:/c++/mingw/ include/c++/3.2/bits/stl_function.h:195: also declared as 'template<class _Tp> struct std::less' here

    ...wenn es eine auf Win kompiliert kriegt, dann kann er mir ja die Datei schicken.



  • Ach so sorry, ich musste maximale Stackgröße noch erhöhen, dann liefs.
    Ich kann nur leider nicht testen, ob die Zeitausgabe okay ist, da das Programm ziemlich lange läuft auf meinem Rechner. Hab jetzt grad keine Lust, WinXP nach 1 Woche Laufzeit neu zu starten. 😃



  • das soll lieber nochmal ein anderer schreiben. ich glaub thomas80d kann das nicht so gut 😃



  • Original erstellt von <o>:
    das soll lieber nochmal ein anderer schreiben. ich glaub thomas80d kann das nicht so gut 😃

    Hilf uns besser mit Code, der bei mir kompiliert, anstatt Müll zu reden!



  • sorry, tut mir leid, ich kann es auch nicht. 😞
    aber der code von thomas dauert ja viel zu lange, wenn er meint 1 woche



  • warum schickt thomas80d dir nicht einfach die ausführbare datei? 😕 😕



  • Original erstellt von <o>:
    warum schickt thomas80d dir nicht einfach die ausführbare datei? 😕 😕

    Hat er gemacht. ...und die Datei wird wohl auch ausgeführt. Es entsteht auch kein Fehler. Allerdings scheint wohl trotzdem etwas mit dem Programm nicht in Ordnung zu sein. Nachdem das Programm länger als 1,5 Stunden gelaufen ist (ich habe es dann abgebrochen), liegt die Vermutung nahe, dass irgendwo eine Endlosschleife entstanden ist. Da noch keine Textdatei erstellt wurde, wird sich die Endlosschleife wohl davor befinden. Wer findet sie zuerst?!

    Wenn mir einer eine ausführbare Datei schickt, bei der es nach jedem Schritt eine Ausgabe gibt, dann sag ich Bescheid, bis wo das Programm kommt.

    [ Dieser Beitrag wurde am 08.10.2002 um 04:02 Uhr von Gregor editiert. ]



  • Dass das Programm solange läuft, liegt an der Stringverkettung. Das sprintf mit anschließendem strcat ist anscheinend ziemlich lahm.



  • Original erstellt von thomas80d:
    Dass das Programm solange läuft, liegt an der Stringverkettung. Das sprintf mit anschließendem strcat ist anscheinend ziemlich lahm.

    ...also sprintf erzeugt wohl einen temporären String, der erstmal zur Speicherung der Zahl benutzt wird. ...das habe ich in Java auch einmal gemacht, allerdings hat das nur etwa 20 Sekunden länger gedauert. ...bei weitem nicht 500 mal so lange.

    Was macht strcat? Ich glaube nicht, dass der ganze vorhandene String bei strcat umkopiert wird, oder? ...selbst, wenn das der Fall wäre, wäre eine um das 500fache längere Laufzeit noch viel zu hoch.

    ...ich kann mir nicht vorstellen, dass das soooo lahm ist.



  • Vielleicht liegst auch daran, dass das Array auf dem Stack angelegt wurde.
    Wenn ich zuhause bin probier ich mal die Heapvariante.

    @Gregor: Den Fehler, den du beim Kompilieren hattest, kannst du beheben, indem du die Funktion less einach umbenennst.



  • Original erstellt von thomas80d:
    **
    @Gregor: Den Fehler, den du beim Kompilieren hattest, kannst du beheben, indem du die Funktion less einach umbenennst.**

    Jo! Ich habe es jetzt tatsächlich kompiliert gekriegt. ...beim Ausführen kriege ich jetzt aber eine "unknown software exception". ...es hat ja vorher schon jemand etwas von einer Exception gesagt. Ist das die? Wie kriege ich die weg?
    (ich glaube, ich mache alles falsch, was man falsch machen kann :))



  • Nimm mal den modifizierten Code.



  • Original erstellt von thomas80d:
    Nimm mal den modifizierten Code.

    OK! ...hat kompiliert und wirft keine Exception. Scheint aber trotzdem wieder länger zu dauern. Ich lass das mal so nebenher laufen und warte, ob es irgendwann ein Ergebnis gibt.



  • Ich habe jetzt mal die Ausgabe vorgezogen. Sie erfolgt jetzt vorerst direkt nach den einzelnen Schritten. Anscheinend ist die Erzeugung des langen Strings (bzw. das aneinanderhängen) tatsächlich das Problem. Trotzdem schonmal die ersten Ergebnisse (ich hatte aber einiges nebenher laufen, so dass die Werte wohl noch ein bischen besser aussehen müßten) :

    Array erzeugen : 0 ms

    Dazu ist allerdings zu sagen, dass bei Java (bei C# weiß ich das nicht) nach dem Erzeugen des Arrays jedes Element des Arrays auf einen Standardwert gesetzt wird. Das wird bei C++ meines Wissens nach nicht gemacht. ...ist aber natürlich auch nicht immer nötig.

    Zufallszahlen : 901 ms

    Sortieren : 311 ms



  • Warum hört keiner auf mich?

    Das Zahlen in Strings umwandeln wird mit sprintf und stringstreams gleichlahm sein, da jedesmal eine komplette Kopie erzeugt wird. und Das kopieren muss pro Zusätzliche Zahl einmal mit allen Zahlen gemacht werden. Das dauert, wie ihr seht Jahre. Verwendet mal deque<char> für strings oder meinet wegen auch list<char>. das umwandeln ansich kann ja mit stringstreams oder sprintf gemacht werden.

    Und beim sortieren bitte std::sort aus <algorithm> nehmen. Das ist um einiges schneller, als qsort, da der Aufruf von less geinlinet werden kann.

    Wenn wir schon vergleichen, dann auch richtig. Wenn kingruedi das nicht hinbekommt, werde ich mich mal bemühen. Aber ich denke, dass er das schaffen sollte.



  • @Helium
    ich will auch noch eine Version, die stärker die STL nutzt und eine möglichst effiziente schreiben, ich wollte nur testen, ob das schneller ist sich stärker auf die alten C Dinge zu verlassen



  • Ich werde jetzt weitere Zeiten der momentanen C++-Version nicht angeben. ...wir wissen ja, was lahm ist und es bringt uns wenig zu wissen, ob jetzt die 1000fache odre die 2000fache Zeit benötigt wird. Ich bin zumindest mal gespannt, ob das in der nächsten Version vernünftig beschleunigt werden kann. Ich habe jetzt übrigens auch eine Java-Version des Programms, in der ich diesen riesigen String "per Hand" als Byte-Array erstelle. ...das ist nochmal etwas schneller. Ich bin mal gespannt, wie schnell ihr an die Zeit rankommt, ich kann mir zumindest nicht vorstellen, dass ihr das nicht schafft. Ihr könnt euch ja auch eine eigene Methode schreiben.


Anmelden zum Antworten