Java vs. C#



  • Mono ist eine Open-Source implementierung des .Net-Frameworks. (mehr oder weniger)



  • Ich hab mal kurz einen Test mit C++ gemacht, wegen des Aneinanderhängens der ganzen Zahlen in einen String. Stingstreams scheien nicht geeignet zu sein. Während die ersten 50000 Zahlen noch blitzartig angehängt waren, dauetre es mit zunehmender Zahl immer länger. Bei 100000 Zahlen Wurde es dann schon merkbar langsam und bei noch mher unerträglich lahm. Woran das genau liegt weiß ich nicht. vielleicht an dem gigantischen Feld, das ja zusammenhängend im speicher leigen muss. Vielliecht sollte der, der das Portiert den String als deque<char> anlegn. Wie man dann allerdings aus Zahlen einen String macht ist eine andere Frage.



  • @Helium
    ich habe eine Version mit stringstreams und eine Version mit sprintf und strcat, mal schauen welche schneller ist.

    Habe aber noch ein Problem beim Zeitmessen 😞



  • Oha! Das Portieren scheint ja schwieriger zu sein, als ich gedacht hatte.

    Wer es nicht weiß : Beim String-aneinanderhängen wird in dem Java-Programm letztendlich zuerst ein riesiges char-Array erstellt, von dem man weiß, dass es groß genug für den String ist. Wenn das char-Array gefüllt ist, dann wird daraus ein String gemacht.

    Wenn man die ganze Zeit mit Strings arbeitet, dann muss man immer etwas umkopieren, wenn man etwas neues anhängen möchte. Das sollte also recht lahm sein. Ein Deque wird wohl auch lahm sein. Ich denke, bei einem Deque wird zu viel Overhead erzeugt. ...allerdings weiß ich garnicht, wie das in C++ implementiert ist.

    [ Dieser Beitrag wurde am 06.10.2002 um 15:23 Uhr von Gregor editiert. ]



  • Was gibt es eigentlich für ein Zeitmessproblem? Ist das mit C++ so schwierig? ...es gibt doch von c her eine "Time.h" (inzwischen wahrscheinlich ohne h), oder? Geht das damit nicht?

    [ Dieser Beitrag wurde am 07.10.2002 um 00:02 Uhr von Gregor editiert. ]



  • Original erstellt von Helium:
    [QB]Ich hab mal kurz einen Test mit C++ gemacht,
    ...
    Vielliecht sollte der, der das Portiert den String als
    ...

    Ja. Ich tue mich immer wieder schwer damit, den Leuten zu verklickern, daß andere Sprachen andere Vorgehensweisen erfordern. Ein Sprachunabhängiges Struktogramm ist, angenommen, man programmiert auf Speed, wie z.B. in den Computerspielen immer als Randforderung dabei ist, ein Produkt, das besser ungelesen in den Papierkorb wandert. "Dont do the C++-Hack in Java!". Und andersrum soll mans natürlich auch nicht machen.
    Man mag C# gegen Java in den Bereichen, wo sie fast gleich sind, gut gegeneinander messen können. Aber anderereseits, 1000000 Wurzeln zu ziehen? Das ist nicht gerade die Aufgabe für Java oder C#! Es ist Wurstegal, opb die Auf Wurzeln optimiert sind. Harte mathematische Berechnungen macht man immernoch in Fortran.
    Falls woanders tatsächlich ein signifikanter Unterschied besteht, dann war das auch nur ein "Feature", das in der nächsten Version weg ist. Technische Sachen von Bedeutung können hier gar nicht gefunden werden. Schließlich ist es innendrin einmal Java mit außenrum zwei Markennamen. An der Sprache kanns nix geben, was der andere nicht leicht nachrüsten könnte.
    In Sachen IDE und Bibliotheken eher. Noch dürfen wir unter Windows per WIN32-API alles. Aber wie lange? Nach WinXP läßt sich MS vielleicht zwei neue Buchstaben einfallen, z.B. WinAJ und ab dann kann man jedes neue Feature (Programmgesteuerte Administration des eingebauten Routers, Terminalserver und die ganzen anderen Sachen, die in anderen MS-BSen bereits da waren, aber mit Win2K sterben werden, in der WinXP-Mega-Teuer kurz auftauchen werden, in der WinAJ als neu erscheinen werden) nur noch durch .net anfassen. Und dann die Treiber, DirectX12 ist nur durch .net anfassbar und insbesondere natürlich auch noch durch C++, wenn es C++.net mit netten MS-Erweiterungen ist, und dann ist Schicht im Schacht.
    Die Frage laute eigentlich allein, obs die freie Entwicklergemeinde (wozu ich auch Emporkömmlinge wie Sun zähle) schaffen kann, gegen MS auf Dauer feine Software zu basteln, die man nicht so schnell in die Ecke knallen muß, wie die aktuellen Unices. Ich habe da meine Bedenken.
    Insofern kann ich bereits das Hauptthema "Java vs. C#" kaum ernst nehmen. Das sind nur zwei Namen des selben Produkts. Was mich ankotzt ist, daß dieser Merketingkrieg so großen Anklang findet. Nicht wenige Professoren lehren zum Beispiel ihren Erstsemestern Jave, weil Jave "echt objektorientiert ist".

    Die Richtung halte ich übrigens für gut, und wären die Kumpels von Sun mir nicht zuvorgekommen, hätte ich das selber erfinden müssen. Es ist reichlich Prozessorpower da. Und Ram ist lahm. Das spricht für mich irgendwie ne Sprache, die sich immer wieder wie "Stackmachines müssen her!" anhört. Bytecode. Ich höre auch ein permanentes "Forth" rumoren. Zunächst interpretiert, und später zunehmend in den Prozessor angesetzt. Man mag sich noch keine benutzerdefinierten Routinen im Hauptprozessor vorstellen. (Gerade hat's mir "Forth" und "ein Forth-Kernel lebt in 8k ganz glücklich" und "8k, ach scheiß auf 8k, wir nehmen 16k auf dem Prozessor" wieder volle pulle angebrüllt.) Aber auf dem Grafik-Ding setzen wie Pixel-Shader und so schon ab. Bestimmt nur, weil die Spieleprogrammierer eh keine Struktogramme malen (Oh, sagte ich bereits, daß UML-Diagramme den selben Effekt haben?).

    Naja, zappelt mal weiter um C# oder Java. Ich guck Euch gerne zu und verwende auch gerne die Errungenschaften, die dabei rauskommen.



  • Warum FORTRAN immer noch so beliebt ist bei Mathematikern, verstehe ich nicht. Also ich finde die Sprache ziemlich umständlich 🙂

    Was ich aber nicht verstehe, warum du Stack Sprachen nicht magst 😕



  • Warum FORTRAN immer noch so beliebt ist bei Mathematikern, verstehe ich nicht. Also ich finde die Sprache ziemlich umständlich 🙂

    speed
    http://www.oonumerics.org/blitz/benchmarks/daxpy.html



  • Naja Blitz++ schneidet ja nicht so schlecht ab, aber ich weiss nicht, was der FORTRAN77 vergleichswert ist, da bei C++ ja 3 unterschiedliche Dinge getestet werden und die Benchmark sieht ein bisschen alt aus 🙂

    BTW.
    Ich denke C# und Java kann man sehr wohl miteinander vergleichen, da dass fast die gleichen Programmiersprachen sind, so wie ich dass sehe, sind die Unterschiede teilweise nur so groß wie zwischen 2 verschiedenen Compilern für eine unstandardisierte Programmiersprache 😉



  • BTW : @ kingruedi : Wie sieht das mit der Portierung aus? Ist das zu schwer? Wenn ja, dann können wir das auch andersherum machen. Du schreibst ein Programm in C++ und ich programmiere es dann in Java nach. ...die C#-Portierung sollte dann ja nicht so schwer sein. ...oder geht das mit der Zeitmessung in C++ so nicht? Dann müssen wir uns etwas anderes einfallen lassen.



  • in ISO C++ kann man nur Sekunden messen, dass ist das Problem, deswegen habe ich eine POSIX Funktion benutzt, erhalte aber immer einen SegFault.

    Ich versuch das nochmal zu überarbeiten. Die Portierung ist aber ansonsten eigentlich okay.



  • Ach so! ...ansonsten könnten wir auch ein Programm schreiben, das für jeden Schritt so lange braucht, dass eine Genauigkeit von einer Sekunde locker ausreicht! Ich hätte keine Probleme, meinen Rechner mal eine halbe Stunde oder so an sowas rechnen zu lassen! 🙂 ...aber vielleicht kriegst du das ja noch hin! Sag einfach Bescheid, wenn es nicht klappt.



  • also der Code macht wohl nur bei mir einen Segfault, woanders geht der ohne Probleme. Hier poste ich ihn mal (die C Like Version)

    #include <iostream>
    #include <cstdlib>
    #include <cmath>
    #include <cstring>
    #include <limits>
    #include <fstream>
    using namespace std;
    
    #include <sys/time.h>
    
    int less(const void *a, const void *b)
    {
      return a<b;
    }
    
    int main()
    {
      struct timeval times[7];
      struct timezone tz;
      const size_t arrayLength=5000000;
      size_t i=0;
    
      //Arrays erzeugen
      gettimeofday(×[0],&tz);
      int *intArray=new int[arrayLength];
      double *doubleArray=new double[arrayLength];
      gettimeofday(×[1],&tz);
    
      //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);
      }
      gettimeofday(×[2],&tz);
    
      //Sortieren
      qsort(static_cast<void*>(intArray),arrayLength,sizeof(int),less);
      gettimeofday(×[3],&tz);
    
      //int to char
      char strBuffer[10];
      char stringBuffer[arrayLength*11+1];
      for(i=0;i<arrayLength;++i)
      {
        sprintf(strBuffer,"%d\n",intArray[i]);
        strcat(stringBuffer,strBuffer);
      }
      gettimeofday(×[4],&tz);
    
      //string in Datei schreiben
      ofstream out("demo.txt");
      if(!out.is_open())
      {
        cerr << "Fehler" << endl;
        return 1;
      }
      out << stringBuffer;
      out.close();
      gettimeofday(×[5],&tz);
    
      //Wurzeln berechnen
      for(i=0;i<arrayLength;++i)
        doubleArray[i]=sqrt(doubleArray[i]);
      gettimeofday(×[6],&tz);
    
      //Ausgabe:
      cout << "Array erzeugen: " << times[1].tv_usec-times[0].tv_usec << "ms" << endl;
      cout << "Zufallszahlen erzeugen: " << times[2].tv_usec-times[1].tv_usec << "ms" << endl;
      cout << "Sortieren: " << times[3].tv_usec-times[2].tv_usec << "ms" << endl;
      cout << "String anhängen: " << times[4].tv_usec-times[3].tv_usec << "ms" << endl;
      cout << "Speichern: " << times[5].tv_usec-times[4].tv_usec << "ms" << endl;
      cout << "Wurzeln berechnen: " << times[6].tv_usec-times[5].tv_usec << "ms" << endl;
    }
    

    [ Dieser Beitrag wurde am 07.10.2002 um 21:27 Uhr von kingruedi editiert. ]



  • warum macht der den aus & times dieses x?

    ×
    

    [ Dieser Beitrag wurde am 07.10.2002 um 21:29 Uhr von kingruedi editiert. ]



  • Schickst du mir bitte eine ausführbare Datei?! ...du kannst das bestimmt besser kompilieren, als ich! (...ich habe hier gerade nichtmal nen C++-Kompiler zur Verfügung 😮 )



  • kann dir nur eine binäre Datei für Linux liefern. Was dir aber nichts bringt, wenn meine Binärys immer einen SegFault enthalten 🙂



  • OK! Ich habe mir jetzt mal MinGW besorgt und versuche, die Datei zu kompilieren. Allerdings bekomme ich ein paar Fehlermeldungen. Da ich mich mit C++ nicht auskenne, kann ich damit nicht allzuviel anfangen. ...ihr müßt mir da mal weiterhelfen :

    Benchmark.cpp:19: aggregate 'timezone tz' has incomplete type and cannot be defined
    Benchmark.cpp:24: 'gettimeofday' undeclared (first use this function)
    Benchmark.cpp:38: use of 'less' is ambiguous;
    Benchmark.cpp:12: 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

    [ Dieser Beitrag wurde am 07.10.2002 um 22:16 Uhr von Gregor editiert. ]



  • gettimeofday funktioniert nur unter Unices. Ich weiss nicht, wie das in WinAPI geht.



  • GetTickCount



  • Original erstellt von kingruedi:
    gettimeofday funktioniert nur unter Unices. Ich weiss nicht, wie das in WinAPI geht.

    Ich werde mich demnächst mal umhören. ...könnte allerdings ein paar Tage dauern. Vielleicht gibt es ja hier jemanden, der schneller ist und entsprechenden Code postet.

    Edit : Da war wohl tatsächlich einer schnell. 🙂

    ...wie kann man das einbinden? ...ich denke mal, ich kann das nicht einfach ersetzen, oder?

    [ Dieser Beitrag wurde am 07.10.2002 um 22:38 Uhr von Gregor editiert. ]


Anmelden zum Antworten