Programmlaufzeitfrage



  • @volkard
    Ich denke man sollte von Einzelfällen nicht immer gleich auf das Ganze schließen. Nur weil std::string, std::iostreams und export in die Hose gegangen sind, heißt das nicht, dass der ganze C++ Standard von bekifften Fachhochschülern gleichwertig hätte entwickelt werden können.

    Es gibt genügend Beispiele, wo Lib und Sprache von den Experten profitiert haben. Und dies scheint auch so zu bleiben.
    Beispiel: http://www.artima.com/cppsource/threads_meeting.html

    Nicht mehr nur @volkard:

    Bw: wenn ich mir das ganze gewurschtel mit den loclaes und facetts anschaue, bezweifle ich auch, dass die iostreams wirklich so superschnell implementiert werden können. locales und facetts sind pro Stream dynamisch austauschbar, können deshalb wohl kaum sinnvoll über statischen Polymorphismus implementiert werden (im Gegensatz zu den Type-Traits). D.h. am Ende bleibt ne Menge Indirektion und viele virtuelle Aufrufe. Dafür bekomme ich halt auch viel Flexibilität.

    Auf der anderen Seite: wenn wirklich die Ein-/Ausgabe der performance-kritische Teil meines Programms ist, dann erscheint es mir nur logisch, dass ich in diesem Bereich selbst optimieren muss und die "general-purpose"-Lösung nicht das non-plus-ultra ist. Das ist doch immer so. Wichtiger ist doch, dass die iostreams für Standardaufgaben ausreichen und das tun sie allemal. Zumindest ist das meine Erfahrung.

    Diese ganze Performance-Geschichte hat natürlich auch mal wieder nichts mit C vs. C++ zu tun. Vielmehr ist sie ein Beispiel dafür, dass konkret, klein und einfach meistens zügiger läuft als abstrakt, groß und flexibel. Würde man die iostreams in C nachbauen, käme man auf eine ähnliche Performance wie in C++.



  • @Plotzenhotz:
    Änder dein Testprogramm mal etwas ab.
    Ich hab hier mal nen kleines Minimal-getline geschrieben:

    std::streamsize my_getline(std::istream& is,char* buf,std::streamsize size,char delim='\n')
    {
    	std::streambuf::int_type int_delim = std::char_traits<char>::to_int_type(delim);
    	std::streambuf::int_type in;
    	std::streamsize s=0;
    	std::streambuf* sb = is.rdbuf();
    
    	in = sb->sgetc();
    	if(std::char_traits<char>::not_eof(in))
    	{
    		while((!std::char_traits<char>::eq_int_type(in,int_delim )) && std::char_traits<char>::not_eof(in)&& s<size)
    		{
    			in = sb->sbumpc();
    			buf[s] = std::char_traits<char>::to_char_type(in);
    			++s;
    		}
    	}
    	buf[s]='\0'; 
    
    	return s;
    }
    

    Und die neue TestIostream3:

    size_t TestIostream3()
    {
        std::ifstream in(gc_inputFileName);
        std::ofstream out(gc_outputFileName);
    
        char buffer[1024];
        size_t outLines = 0;
    	std::streamsize ss=0;
    
        while(1)
        {
            if(!(ss = my_getline(in,buffer, sizeof(buffer))))
                break;
            if(!(ss = my_getline(in,buffer, sizeof(buffer))))
                break;
    
            out.rdbuf()->sputn(buffer,ss);
            ++outLines;
        }
        return outLines;
    }
    

    Mit VS8 im "Standard" Releasemode:

    TestStdio: Lines: 80000, time: 140 msec
    TestStdio: Lines: 80000, time: 120 msec
    TestStdio: Lines: 80000, time: 122 msec
    TestStdio: Lines: 80000, time: 121 msec
    TestStdio: Lines: 80000, time: 121 msec
    TestIostream3: Lines: 80000, time: 98 msec
    TestIostream3: Lines: 80000, time: 101 msec
    TestIostream3: Lines: 80000, time: 96 msec
    TestIostream3: Lines: 80000, time: 112 msec
    TestIostream3: Lines: 80000, time: 114 msec

    Sieht schon etwas anders aus,oder?
    Die Frage die bleibt......wer möchte so arbeiten?
    Ist wie bei nem Auto,je mehr Sonderausstattung und Extras du da rein packst desto teurer und langsamer wird es.Und trotzdem ist es irgendwie doch das bessere Auto.

    PS:Was ist eigentlich mit dem Forum los?War ja schon wieder stundenlang nicht erreichbar 😞 .

    Gruß Spacelord



  • @Spacelord:
    Jo, sieht etwas anders aus 🙂
    Du kommst aber nochmal auf ca. 50% von der Zeit wenn du einfach 2 grosse Buffer nimmst und dann selbst von einem zum anderen Bytes schippst. Ist aber ein Haufen Code wenn man alle Randbedingungen 100% einhalten und das ganze auch halbwegs schnell hinbekommen will... 🙂

    @HumeSikkins:
    Das "threads meeting" Beispiel finde ich unglücklich gewählt. Ich für meinen Teil finde es ziemlich peinlich (und ärgerlich) dass der C++ Standard über Threads bis heute nichts zu sagen hat. Ich meine multi CPU Systeme sind ja nicht gerade was neues, und preemtives Multitasking gibts auch schon seit Jahrzehnten. Weiters ist so ziemlich alles was da diskutiert wurde ein alter Hut. Gut dass mal konkret drüber gesprochen wird das in C++ zu standardisieren, aber guck dir mal das Proposal von Kevlin Henney (der ja auch zitiert wurde) und die C extension "Cilk" an.


Anmelden zum Antworten