Sollte man Optimierung für bestimmte seltene Fälle einbauen?



  • da darueber zu streiten genau so sinnlos ist wie ohne profiling zu optimieren (meine meinung), hab ich euch mal ein sample zusammengestrickt

    int Foo(int x)
    {
    	const int X=x;
    	x*=x;
    	x*=x;
    	x*=x;
    	x*=x;
    	if(X==~0)
    		return 2;
    	x*=x;
    	x*=x;
    	x*=x;
    	x*=x;
    	return x;
    }
    
    #include <Windows.h>
    #pragma comment ( lib, "winmm.lib" )
    
    int Foo(int);
    int main(int argc,char* argv[])
    {
    	const int Loops = 1000000000;
    	int x=1;
    	int T0 = timeGetTime();
    	for(int a=0;a<Loops;a++)
    		x	=	Foo(x);
    	int T1 = timeGetTime();
    	printf("%dms %d\n",T1-T0,x%4);
    	return 0;
    }
    

    beide teile mussen in verschiedene translation units um jegliche compiler inlining optimierungen die das ergaebniss verfaelschen koennten auszuschliessen.

    der auskommentierte teil ist die simulierte if abfrage, diese schlaegt NIE an, sie ist also eigentlich nur verlust.

    bei mir:
    ohne: 12030ms
    mit: 12010ms

    die ergebnisse unterscheiden sich, bis auf kleines rauschen, nicht.



  • volkard schrieb:

    Bleibt nur noch zu fragen, wann und wo und warum man die Optimierungen für Zero, One und MinusOne sieht. Ach ja, bei Langzahlarithmetik. Klar, wenn man bei 100000000 Ziffern eine ganze Rechnung spart, ist die Einsparung so groß, daß man das bereits bei einer wahrscheinlichkeit von eins zu einer Million versucht.

    Bei einer Wahrscheinlichkeit von 1 zu 1 Mio. ist die Erreichbare Verbesserung immer irrelevant, da sie im Bereich von 1 zu 1 Mio liegt. Ganz egal wie lange eine Operation braucht. Bei einer Laufzeit von 1 Mio stunden interessiert es micht überhaupt nicht ob eine Stunde gespaart wurde oder nicht.

    Bei Langzahlarithmetik würde ich aber ohne auch nur darüber nachzudenken solche Optimierungen einbauen. Weils halt irgendwie Sinn macht. Und weil Null, Eins und minus Eins ja nicht wirklich seltene Zahlen sein müssen.



  • hustbaer schrieb:

    Bei einer Wahrscheinlichkeit von 1 zu 1 Mio. ist die Erreichbare Verbesserung immer irrelevant, da sie im Bereich von 1 zu 1 Mio liegt. Ganz egal wie lange eine Operation braucht. Bei einer Laufzeit von 1 Mio stunden interessiert es micht überhaupt nicht ob eine Stunde gespaart wurde oder nicht.

    aber ein if kostet nur eine million stel sekunde. und bei einer lauf zeit von einer oder einer million sekunden, also einer sekunde oder 12 tagen bist du sicherlich interessiert.
    ist die mathe matik dir denn völlig fremd?



  • volkard schrieb:

    aber ein if kostet nur eine million stel sekunde.

    Was hast Du denn für eine CPU? 1MHz?



  • Hängt davon ab wie lang eine stel-sekunde ist.



  • volkard schrieb:

    hustbaer schrieb:

    Bei einer Wahrscheinlichkeit von 1 zu 1 Mio. ist die Erreichbare Verbesserung immer irrelevant, da sie im Bereich von 1 zu 1 Mio liegt. Ganz egal wie lange eine Operation braucht. Bei einer Laufzeit von 1 Mio stunden interessiert es micht überhaupt nicht ob eine Stunde gespaart wurde oder nicht.

    aber ein if kostet nur eine million stel sekunde. und bei einer lauf zeit von einer oder einer million sekunden, also einer sekunde oder 12 tagen bist du sicherlich interessiert.
    ist die mathe matik dir denn völlig fremd?

    Was ist denn jetzt kaputt?
    Du schreibst von einer Wahrscheinlichkeit von 1 zu 1 Mio. Und sogar wenn ich mir 1% aller Rechnungen spare komme ich nicht von 1 Mio Sekunden auf eine Sekunde runter. Ist DIR Mathematik denn komplett fremd?
    😕



  • mehrere if Schleifen mit equals-Methodenaufrufen aufrufen, die wiederum zeit brauchen.

    http://www.if-schleife.de



  • if-schleife.de schrieb:

    mehrere if Schleifen mit equals-Methodenaufrufen aufrufen, die wiederum zeit brauchen.

    http://www.if-schleife.de

    void if_schleife (int n)
    {
      if (n)
        if_schleife (n-1);
      printf ("%d\n", n);
    }
    
    int main (void)
    {
      if_schleife (10);
    }
    

    ^^ich weiss, ist alt.
    🙂



  • +fricky schrieb:

    if-schleife.de schrieb:

    mehrere if Schleifen mit equals-Methodenaufrufen aufrufen, die wiederum zeit brauchen.

    http://www.if-schleife.de

    void if_schleife (int n)
    {
      if (n)
        if_schleife (n-1);
      printf ("%d\n", n);
    }
    
    int main (void)
    {
      if_schleife (10);
    }
    

    ^^ich weiss, ist alt.
    🙂

    nicht so alt wie dein Bart :p



  • hustbaer schrieb:

    Was ist denn jetzt kaputt?
    Du schreibst von einer Wahrscheinlichkeit von 1 zu 1 Mio. Und sogar wenn ich mir 1% aller Rechnungen spare komme ich nicht von 1 Mio Sekunden auf eine Sekunde runter. Ist DIR Mathematik denn komplett fremd?
    😕

    ^
    du sparst dir EINMAL von einer million die teure rechnung, die millionenmal teurer als ein if ist und zahlst dafür jedesmal ein if mehr.



  • volkard schrieb:

    hustbaer schrieb:

    Was ist denn jetzt kaputt?
    Du schreibst von einer Wahrscheinlichkeit von 1 zu 1 Mio. Und sogar wenn ich mir 1% aller Rechnungen spare komme ich nicht von 1 Mio Sekunden auf eine Sekunde runter. Ist DIR Mathematik denn komplett fremd?
    😕

    ^
    du sparst dir EINMAL von einer million die teure rechnung, die millionenmal teurer als ein if ist und zahlst dafür jedesmal ein if mehr.

    Ja verstehe ich schon.
    Die Gesamtlaufzeit des Programms ändert sich dadurch aber nicht wesentlich.

    Ich hab' ja bereits geschrieben dass ich es in dem Fall sicher auch machen würde. Weil es eben vermutlich Fälle gibt wo sehr oft 0, 1 oder -1 vorkommt. Und natürlich auch weil der Test so billig ist. Grundsätzlich bleibe ich aber dabei: eine Optimierung die mir eine Verbesserung um ein Millionstel bringt ist witzlos. Egal wie gross dieses Millionstel ist.



  • hustbaer schrieb:

    Grundsätzlich bleibe ich aber dabei: eine Optimierung die mir eine Verbesserung um ein Millionstel bringt ist witzlos. Egal wie gross dieses Millionstel ist.

    ja. jetzt verstehe ich dich.

    unabhängig davon, daß du recht hast: "grundsätzlich" würde ich wie immer nicht sagen. es war ja nur eine wahrscheinlichkeit. für mich selber würde ich diese optimierung auch bei langzahlen weglassen. als bibliotheksentwickler würde ich auf die zielgruppe schauen müssen und sie im zweifelsfall unter umständen vielleicht gegen meine überzeugungen eher einbauen, weil sie mit optimierung unmerklich langsamer wird aber bei den nasen, die andauernd mit 0 oder 1 multiplizieren, statt sich vorher gedanken zu machen, satt was bringt.



  • Bei einer Wahrscheinlichkeit von 1 zu 1 Mio.

    Das ist 'ne Art running gag bei Terry Pratchett. Wenn diese Chance exakt ist, dann wuerde ich auf alle Faelle optimieren.



  • rapso schrieb:

    bei mir:
    ohne: 12030ms
    mit: 12010ms

    Das kann garnicht sein, das sind zwei Anweisungen mehr. Glaubst du, dass hier alle doof sind und nur dein Paradoxon stimmt? 🙄



  • Ok danke für die zahlreichen Antworten.

    Ach ja das mit den schleifen: da hab ich nur das falsche Wort geschrieben 🙂
    Ich habe keine! if-schleife eingebaut...

    ich werde einfach glaub ich ein boolean special einbauen, und nur dieses abfragen anstelle von mehreren vergleichen. Diese operation dürfte dann nicht ins gewicht einfallen bei den normalen berechnungen. Wenn dann ein speizialfall eintrifft kann ich dann noch immer abfragen um welches es sich handelt und danach handeln.



  • Beispiel:

    Du kannst etwas 10 fach beschleunigen was zu 20% im Programm vorkommt.
    (Das ist schon was, was man nur durch nen besseren Algorithmis schafft und sehr viel!)

    Rechnung:

    Gesamtbeschleunigung= 1/((1-0.2)+(0.2/10)) = 1.22
    Hierbei wird das Gesamtprogramm lediglich 1.22 mal so schnell.

    Da kann man sich überlegen ob es was brint etwas zu beschleunigen was noch viel seltener ist!



  • Algorithmis := Algorithmus 🙂



  • volkard schrieb:

    tfa schrieb:

    Optimiert wird nur, wenn du wirklich ein Performance-Problem hast, und das scheint nicht der Fall zu sein, oder?

    Ihr Schnapsnasen! Natürlich macht man sich von Anfang an Gedanken darüber. Will man solcherlei Art der Optimierung erlauben, kommt ein ganz anderes Klassengerüset heraus (und keine if-Schleifen).
    Und hier ist die Überlegung auch so einfach, daß man das tatsächlich ohne Profiler schafft, wie tfa und Mr Evil beweisen. Der Profiler mag Euch zwar das Nachdenken abnehmen können, aber doch erst im Nachheinein, wenns schon zu spät ist, wenn für eine tiefgreifende Optimierung alles umgeschubst werden muß.

    Bleibt nur noch zu fragen, wann und wo und warum man die Optimierungen für Zero, One und MinusOne sieht. Ach ja, bei Langzahlarithmetik. Klar, wenn man bei 100000000 Ziffern eine ganze Rechnung spart, ist die Einsparung so groß, daß man das bereits bei einer wahrscheinlichkeit von eins zu einer Million versucht.

    Bei solchen Spassaufgaben kann man sich über sowas gedanken machen. Wenn du dir bei realen Projekten, die in einem bestimmten Zeitraum fertiggestellt sein müssen, bei jeder Funktion an solche "Optimierungen", wie z.B. mach ich da noch ein if für diesen Speziallfall, denkst, wirst du nie fertig. In realen Projekten solltest du dir zuerst Gedanken über die Wart- und Erweiterbarkeit deines Softwaredesigns Gedanken machen. Dann kannst du dir überlegen welche Datenstrukturen und Algorithmen du verwendest, das sind die Sachen die wirklich Performance bringen. O(n²) vs. O(n) usw. Diese Mikrooptimierungen von ein paar Befehlen kannst du machen, wenn du raus gefunden hast, dass dein Programm wirklich ein paar Milliarden mal an dieser stelle vorbeikommt und es keine Möglichkeit gibt das zu vermeiden. Gut, wenn du beruflich Frameworks programmierst die dann von tausenden anderen verwendet werden, dann kannst du dir überlegen, ob das list.insert diesen oder jenen Befehl braucht, aber sowas macht sowieso fast keiner. Aber ich glaub beruflich hast du noch nie an nem größeren Projekt (mehrere Mannjahre), das dann an Kunden ausgeliefert wurde, gearbeitet, stimmts?



  • zzzzzzz schrieb:

    bla

    die überlegung dauert hier keine zehn sekunden. da muß man sich nicht mit solcher gewalt dagegen wehren.



  • volkard schrieb:

    zzzzzzz schrieb:

    bla

    die überlegung dauert hier keine zehn sekunden. da muß man sich nicht mit solcher gewalt dagegen wehren.

    Nein volkard. premature optimization is the root of all evil. Immer, ausnahmslos. Merk dir das endlich!!! 😡 😡 😡 👎 👎


Anmelden zum Antworten