Laden...

[gelöst] performanter(?) vs übersichtlicher

Erstellt von Bit2_Gosu vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.276 Views
B
Bit2_Gosu Themenstarter:in
116 Beiträge seit 2007
vor 15 Jahren
[gelöst] performanter(?) vs übersichtlicher

Hi!

Ich muss im moment sehr performanten code schreiben. nun meint man ja, version 1 ist performanter als version 2, dafür ist version 2 übersichtlicher - das ergebnis ist dass selbe:

Version 1:

if (EINE BEDINGUNG)
            {
                foreach (IRGENDWAS)
                {
                    MACH A
                    MACH B
                }                 
            }

            else
            {
                foreach (IRGENDWAS)
                {
                    MACH A
                }             
            }

Version 2:

foreach (IRGENDWAS)
                {
                    if (EINE BEDINGUNG)
                    {
                       MACH A
                       MACH B
                    }
                    else
                    {
                        MACH A
                    }
                } 

wenn dieser code wirklich umbedingt performant sein soll, frage ich mich trotzdem, ob ich version 1 nehmen soll. ich habe nämlich gehört, der compiler strukturiert eh nochmal nach performance um. allerdings weiß ich jetzt nicht, ob er sowas auch macht.

welche version würdet ihr in meiner situation nehmen?

5.742 Beiträge seit 2007
vor 15 Jahren

Hallo Bit2_Gosu,

welche version würdet ihr in meiner situation nehmen?

Version 3 😉 :


foreach (/*...*/)
{
   A();
   if (/*Bedingung*/)
      B();
}

Eine if-Abfrage kostet so wenig Performance, dass du sie durchaus in jedem Schleifendurchgang eine stehen haben kannst.
Wenn es sich um eine sehr aufwendige Bedingung handelt, kannst du die Prüfung auch auslagern, indem du vor der Schleife eine boolsche Variable b (oder wie auch immer) deklarierst, die du zur Prüfung verwendest.

Mein Fazit daher: Übersicht.

//EDIT:
Glückwunsch übrigens zum 100. Beitrag 🙂

Q
214 Beiträge seit 2006
vor 15 Jahren

Hallo,

Eine if-Abfrage kostet so wenig Performance, dass du sie durchaus in jedem Schleifendurchgang eine stehen haben kannst.

Es gibt im hoch performance Bereich nichts schlimmeres als Sprünge, egal ob bedingt oder unbedingte Sprünge.
Diese brauchen unglaublich viel Zeit und schmälern die Performance des Programmes enorm! (Gut, manch andere Dinge sind noch erheblich schlimmer)

Hinzu kommt die Auswertung des Statements, die unter Umständen längern dauern kann. Das Ergebnis sollte man also evt. vorab berechnen und dann nur noch auf true/false überprüfen.

Da sich aber C# für hoch performance Rechnen eh nur bedingt eignet (besser wäre C/C++), kann man die Variante von winSharp93 problemlos nutzen.

Und was die Performance angeht:
Normalerweise sind solche Überlegungen eher überflüssig und bringen keinen Performance Gewinn. Ganz anders sieht es aus, wenn deine foreach Schleife z.B. 10 oder 100 Millionen Durchläufe hätte. Dann merkt man schon ob dort ein bedingter Sprung enthalten ist oder nicht.

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo Bit2_Gosu,

die beiden Codestücke sind nur dann äquivalent, wenn sich die Bedingung innerhalb der Schleife nicht ändert. Und wenn sie das nicht tut, kann es - ganz unabhängig von der Performance - durchaus übersichtlicher im Sinne von verständlicher sein, wenn man sie vor die Schleife(n) zieht.

herbivore

B
Bit2_Gosu Themenstarter:in
116 Beiträge seit 2007
vor 15 Jahren

stimmt, in diesem fall ist es sogar nicht so eindeutig, was übersichtlicher ist, wie ich erst dachte.

und da ihr ja meintet, dass es einen performance unterschied gibt, entscheide ich mich für variante 1.

Danke!

1.130 Beiträge seit 2007
vor 15 Jahren

Ich denke, dass man bei ifabfragen, sofern die Bedingung nicht allzu komplex ist in 99,99% der Fälle nicht auf die Performance achten muss.

Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!