Welche Programmiersprache für das internet



  • Original erstellt von ms:
    Du kennst dich nicht gut genug mit Java aus?

    Ne, wozu sollte ich mich mit Java beschaeftigen? Volkard hats mir ausgeredet...

    Dann bist du wohl ein Anfänger oder du hast noch nie einen Toaster bedient!

    Verstehe den Zusammenhang nicht...
    Toaster kann ich bedienen, aber Java nicht programmieren - wo ist der Zusammenhang?

    Schon mal ein MFC-Programm auf Linux portiert?

    Nein.
    Hast du schon mal ne Java VM geschrieben?



  • Original erstellt von Shade Of Mine:
    **
    Was die Kritikpunkte angeht: sind wir im Kindergarten? Ich glaube doch wohl eher nicht. Wir koennen ordentlich diskutieren, oder willst du nicht?**

    Öhmmm... Diese Kritikpunkte wurden so oder so ähnlich alle schonmal in diesem Forum genannt. Andere sind mir nicht eingefallen. Sorry! ...ich habe die nur reproduziert. Die sind nicht von mir. Wenn sie dir zu wenig begründet erscheinen, dann kann ich da nichts für. Die meiste Kritik, die gegen Java kommt ist nunmal unbegründet.

    Abgesehen davon ist der Thread sowieso ziemlich OT inzwischen. Ursprünglich ging es nicht um Java vs. C++, oder? Ich schlage vor, damit aufzuhören. ...an dem neuen C++-Programm habe ich aber trotzdem noch Interesse. Du kannst das Programm ja in dem anderen Thread posten, wenn du es fertig hast.



  • @ Shade : Öhmmm... Wo ist denn jetzt das Programm? Dürfte doch nicht so schwer sein, soetwas zu schreiben. Das ist doch ganz kurz.

    EDIT : BTW : Ich habe gerade einen neuen Kritikpunkt von Volkard gehört :

    • Das Fehlen des Operatorüberladens führt zu unlesbarem Code!
      🙂

    [ Dieser Beitrag wurde am 25.10.2002 um 20:36 Uhr von Gregor editiert. ]



  • Original erstellt von Gregor:
    @ Shade : Öhmmm... Wo ist denn jetzt das Programm? Dürfte doch nicht so schwer sein, soetwas zu schreiben. Das ist doch ganz kurz.

    ich schau mal, was sich machen laesst, ok? 😉

    [ Dieser Beitrag wurde am 25.10.2002 um 20:38 Uhr von Shade Of Mine editiert. ]



  • Ich kopiere das Programm einfach mal hier herein. Ich habe noch eine schnellere Version, bei der ich etwas mit Hand optimiert habe. Die C++-Programme, die zu dem Java-Programm bisher geschrieben wurden, waren beim String-aneinanderhängen bzw. erzeugen lahm. Beim Rest waren sie größtenteils schneller, aber die String-Sache hat im Prinzip alles versaut. Die bessere der beiden Java-Versionen hat den riesigen String bei mir in 2 Sekunden erzeugt. Die beste C++-Version hat über 70 Sekunden gebraucht,

    Programm :
    [java]
    import java.util.;
    import java.io.
    ;

    public class Benchmark
    {
    public Benchmark ()
    {
    }

    public static void main (String[] args)
    {
    long [] times = new long [7];
    int i;
    int arrayLength = 5000000;
    times [0] = System.currentTimeMillis ();
    // Array erzeugen
    int [] array = new int [arrayLength];
    double [] doubleArray = new double [arrayLength];
    times [1] = System.currentTimeMillis ();
    // Zufallszahlen erzeugen
    Random rand = new Random();
    for (i = 0 ; i < arrayLength ; ++i)
    {
    array[i] = rand.nextInt ();
    doubleArray[i] = Math.abs(rand.nextDouble ());
    }
    times [2] = System.currentTimeMillis ();
    // Array sortieren
    Arrays.sort(array);
    times [3] = System.currentTimeMillis ();
    // Zahlen des Arrays in einen großen String verwandeln (jede Zeile eine Zahl)
    StringBuffer stringBuffer = new StringBuffer (arrayLength * 12);
    for (i = 0 ; i < array.length ; ++i)
    {
    stringBuffer.append(array[i]);
    stringBuffer.append('\n');
    }
    String string = stringBuffer.toString ();
    times [4] = System.currentTimeMillis ();
    // String in eine Datei abspeichern
    BufferedWriter writer;
    try
    {
    writer = new BufferedWriter (new FileWriter ("test.txt"));
    writer.write (string);
    writer.close ();
    }
    catch (IOException e)
    {
    System.out.println ("FEHLER FEHLER FEHLER FEHLER FEHLER");
    }
    times [5] = System.currentTimeMillis ();
    // Wurzeln berechnen
    for (i = 0 ; i < doubleArray.length ; ++i)
    {
    doubleArray[i] = Math.sqrt(doubleArray[i]);
    }
    times [6] = System.currentTimeMillis ();
    // Ausgabe der Zeiten
    System.out.println ("Array erzeugen : " + String.valueOf (times[1]-times[0]) + "ms");
    System.out.println ("Zufallszahlen erzeugen : " + String.valueOf (times[2]-times[1]) + "ms");
    System.out.println ("Sortieren : " + String.valueOf (times[3]-times[2]) + "ms");
    System.out.println ("String (anhängen) : " + String.valueOf (times[4]-times[3]) + "ms");
    System.out.println ("Speichern : " + String.valueOf (times[5]-times[4]) + "ms");
    System.out.println ("Wurzeln berechnen : " + String.valueOf (times[6]-times[5]) + "ms");
    }
    }[/code]
    bitte Sourcecode, der mit MinGW (also letztendlich g++) kompiliert. (für Windows)



  • Original erstellt von Gregor:
    Ich habe noch eine schnellere Version, bei der ich etwas mit Hand optimiert habe.

    Und? Warum ist das net drin? Wolltes'te der erst ein Patent darauf anmelden, oder wie? 🙂

    O'Dog



  • Original erstellt von O'Dog:
    **Und? Warum ist das net drin? Wolltes'te der erst ein Patent darauf anmelden, oder wie? 🙂
    **

    Nein! An der anderen Version kann man nicht so gut sehen, was eigentlich gemacht wird. ...in dem anderen Thread ist der Source davon zu sehen.

    EDIT : Du kannst ja auch noch etwas dran rumoptimieren. ...beim Zufallszahlengenerator bin ich z.B. überfordert, ich denke aber, dass man den noch ganz gut beschleunigen kann. ...bzw. dass ein handgeschriebener, der das Gleiche macht, schneller ist.

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



  • Original erstellt von Gregor:
    Die C++-Programme, die zu dem Java-Programm bisher geschrieben wurden, waren beim String-aneinanderhängen bzw. erzeugen lahm.

    Jo, ist mir auch aufgefallen... Hab gerade mal meine eigene string klasse statt std::string verwendet, und siehe da, es geht statt in 20 sekunden in 0,6 sekunden geschafft...
    IMHO liegt es an dem miesen int2string konvertierer von strstring bzw. stringstream.

    Ich habe mit std::string aber einer eigenen int2string Funktion 1,3 sekunden geschafft...

    Ich habe ebenfalls einen 1,2GHzer - deswegen vergleiche ich die zeiten jetzt mal brutal mit deinen...



  • 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. ]


Anmelden zum Antworten