try catch Blöcke langsam? Performance.



  • Hallo,

    da ich versuche mein Programm möglichst schnell zu halten wollte ich mal so nachfragen wie sich die performance von try-catch blöcken äußert?
    Wenn ich diese z.B 1000 in einer for-schleife drin hätte , würden diese das Programm merklich langsamer machen?
    Danke euch



  • warum probierst du es nicht einfach aus ?



  • bevor man eine frage stellt, sollte man wenigstens mal suchen, wie es denn damit aussieht, oder sich vieleicht einmal selbst die Gedanken machen, wie viel performance es kosten würde.



  • Ja ich suche auch - so viel ich darüber nachdenke so wenig kann ich mir selbst erklären weil mein Verständnis leider nicht so tief reicht.
    Ausprobieren könnte man, leider würde das wohl mehr Zeit kosten als diese Frage zu stellen - ich müsste an sehr sehr vielen stellen Hand anlegen um alles in try Blöcke zu packen. Und jetzt in kurzer Zeit ein reduziertes programm zu coden würde mich auch etwas kosten.

    Aber gut - war ja nur ne Frage.



  • #include <math.h>
    #include <iostream>
    using namespace std;
    
    int CalculateSomething( int x )
    {
        int a = x * x + 100;
        a += (int)log10( (double)a );
        return a;
    }
    
    int main(...)
    {
        for ( int i=0; i<100000; i++ )
        {
            try
            {
                int j = CalculateSomething( i );
                if ( j == 1 )
                    cout << "Help Help!" << endl;
            }
            catch( ... )
            {
            }
        }
        return 0;
    }
    

    Ist sowas so schwer 😕



  • Mit MSVC kosten try blocke "relativ sehr wenig" 😃

    Das Werfen von Exceptions dagegen kostet schon etwas.
    Genaue Zahlen kann ich dir nicht geben, da es für mich bis jetzt nicht wichtig war -- wir verwenden Exceptions nicht zum "flow control", d.h. die treten normal auch nicht in (Performence-)kritischen Bereichen von Programmen auf, d.h. es kann uns egal sein wie schnell oder langsam es ist eine Exception zu werfen & zu fangen.



  • Mambo schrieb:

    Und jetzt in kurzer Zeit ein reduziertes programm zu coden würde mich auch etwas kosten.

    ist schon klar. die anderen hier haben viel mehr zeit.
    schon ein bisschen frech die anderen fuer sich etwas austesten zu lassen, weil es dich etwas (zeit) kostet.
    davon abgesehen haengt es auch davon ab, was in der schleife berechnet wird. wenn
    der code pro schleifendurchgang 10 ms braucht, macht sich ein try-block, mit oeffterem werfen, weniger bemerkbar als wenn jeder durchgang nur 30 ticks dauert.

    Meep Meep



  • ist schon klar. die anderen hier haben viel mehr zeit.

    Das habe ich niemals behauptet! Ich zwinge niemanden auf meinen Post zu antworten - wenn jemand keine Zeit hat soll er es lassen anstatt sich die Zeit zu nehmen solche Vorwürfe zu leisten.

    schon ein bisschen frech die anderen fuer sich etwas austesten zu lassen, weil es dich etwas (zeit) kostet.

    ich habe niemanden darum gebeten code zu testen. Ich habe lediglich eine Frage gestellt die meiner Meinung mit einem Satz von jemand beantwortet werden könnte, der ebenfalls schon mal vor dieser Frage stand und diesen Erfahrungswert weitergeben könnte.

    Ich muss leider immer wieder bemerken dass Programmierer offensichtlich ihr Wissen für sich behalten wollen. Natürlich ist es ein learning by doing, aber in gewissen Sachen ist es einfach Egoismus.
    Und in vielen Bereichen hat ein "Neuling" oft nicht das tiefere Verständnis mit eigener Kraft dahinterzukommen. So genug der Rede.

    Die exception wird in meinem fall nur einmal geworfen, wenn was schlimmes schief geht und dann bricht das programm ab. Von daher kostet der catch block nichts. ich weiß leider zu wenig darüber wie der compiler intern so einen try-catch block overhead erzeugt. ja - hier könnt ihr mir vorwerfen dass ich zu wenig Compilerbau gelesen habe.
    Ich stelle mir z.B die frage, wenn ich z.b eine Send-operation zwischen Threads habe und diese ständig testen will in einer while schleife ob sie fertig ist, und alles in einen try-catch block packe (für den fall das die send-operation schief läuft), ob das alles bremst.

    Aber ich erwarte nichts mehr hier. In diesem Sinne danke ich allen beteiligten die versucht haben sinnvolle posts zu geben.



  • Dass du keine konkreten Antworten bekommst, liegt nicht an unserer nicht-Hilfsbereitschaft 😉 Es ist nur so, dass wir meist auch die Eigeninitiative fördern wollen, was ziemlich wichtig ist. Es bringt nix, wenn wir alles vorkauen und auf nem silbernen Tablett anbieten. Du wirst in Zukunft noch ziemlich viele Fragen haben (was ja auch gut ist!) und ein Teil des Lernprozesses beim Programmieren ist es auch, solche Sachen dann einfach auszuprobieren. Sowohl Sachen auszuprobieren als auch z.B. ordentlich bei Google suchen zu können will gelernt sein. Wir unterstützen hier auch gerne jeden, aber wie gesagt, etwas Eigeninitiative sollte jeder zeigen.
    Es wäre wirklich einfach gewesen, schnell einen Post á la "Exceptions sind nur langsam wenn sie geworfen werden, sonst kosten try-catch-Blöcke fast nichts" abzusetzen; aber darum geht es nicht.
    Und es war keineswegs böse gemeint! 🙂



  • Ich stimme Dir (Badestrand) vollkommen zu. Nur leider wird einem oft einiges unterstellt (zu wenig gesucht etc...). Und auch wenn ich es ausprobiert hätte - ich würde mir doch noch gern von jemandem dritten die Meinung bestätigen lassen.
    Ich werde es in Zukunft versuchen anders zu gestalten.

    Danke



  • Ich muss hier als alteingesessenes Forumsmitglied Mambo mal in Schutz nehmen.
    Seine Verhaltensweise und Argumentation ist völlig in Ordnung.
    Er hat eine nicht triviale technische Detail-Frage in einem dafür vorgesehenem technischen Forum gestellt.
    Gibt also keinen Grund ihn so anzuraunzen.
    Theoretisch kann JEDER IMMER die Antwort auf seine Frage durch suchen und probieren selbst finden.
    Ein Forum ist dazu da diesen Prozess durch Erfahrungsaustausch zu beschleunigen und Diskussionen zur technischen Lösung anzuregen.
    Also war Mambos Frage völlig legitim.
    Dieser Beitrag ist aber anonsten genauso off-topic wie die Raunzerei 😉 :p



  • Ok,

    ich habe es nun ausgiebig getestet und komme zu dem Resultat, dass es keinen Unterschied macht bei meiner Verwendung.

    Die Verwendung bei mir sieht sehr vereinfacht so aus:

    for (int i = 0; i < 50; i++)
    {
            //der folgende Teil kommt noch in anderen funktionen
            // ca. 15 - fach vor (natürlich dann auch ein Recv bzw. Test
            try 
            {
                   MPI::Send(...)
             }
             catch(MPI::Exception ex)
            {
                    throw std::runtime_error(...)
            }
    
            for (int i = 0; i < 50; i++)
            {
                     try 
                    {
                           MPI::Send(...)
                     }
                    catch(MPI::Exception ex)
                    {
                            throw std::runtime_error(...)
                    }
            }
    }
    

    Meine Frage:
    Macht es Sinn solche try und catch sachen zu verwenden? Die MPI-Bindings die ich hier verwende werfen ja von sich auch schon exceptions und beenden das Programm im Notfall. Ich dachte evtl. ist es hilfreich dem runtime_error Informationen mitzugeben wie ex.Get_error_code() oder ex.Get_error_string().

    ?



  • Mambo schrieb:

    Meine Frage:
    Macht es Sinn solche try und catch sachen zu verwenden? Die MPI-Bindings die ich hier verwende werfen ja von sich auch schon exceptions und beenden das Programm im Notfall. Ich dachte evtl. ist es hilfreich dem runtime_error Informationen mitzugeben wie ex.Get_error_code() oder ex.Get_error_string().

    ?

    Das musst du entscheiden. Helfen die Error-Codes irgendwem? Kannst du nicht was sinnvolleres mit den Exceptions anfangen (retry vielleicht?)?



  • Dachte ich mir.

    Nun ja, falls ein Fehler auftritt wollte ich die runtime_error - AUsgabe noch reinbringen in welcher Methode und mit welcher Operation das passiert ist.
    Aber hier bin ich mir unsicher ob das nicht sowieso von Haus aus über MPI dann ausgeworfen wird wo der Fehler passiert ist. So ist es nur dem anwender vom Nuetzen der auch selber Hand anlegen würde für den Fall der Fälle.


Anmelden zum Antworten