Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Nelrim

Frischling

  • »Nelrim« ist der Autor dieses Themas

Beiträge: 33

Beruf: Entwicklungskonstrukteur

  • Private Nachricht senden

1

11.02.2008, 13:35

Theoretische Frage zu Geschwindigkeit und boolschen Operator

Um eines vorweg zu nehmen:
Ein konkretes Problem liegt bei mir sicher noch nicht vor.

Im Buch wird ja mehrmals darauf hingewiesen, das Geschwindigkeit extrem wichtig ist bei der Spieleentwicklung.

Jetzt habe ich vorhin in anderem Zusammenhang über folgendes nachgedacht:

Stellen wir uns vor wir hätten ein Zufallsereignis programmiert, das von einigen anderen Ereignissen abhängig ist.

Also soetwas:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
if (k=1 && r=1 && b> 3 && c < 19 && Wetter = schön)

{
cout << "Herzlichen Glückwunsch, du hast den Jackpot geknackt" << endl;
}
else if (k=1 && r=1 &&b >3 && c <19 && Wetter = schlecht)
{
cout << "Herzlichen Glückwunsch, du hast einen Regenschirm gewonnen" << endl;
}


Jetzt könnte man das ja auch durch if verschachtelungen programmieren:

Also etwa so:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if (k=1)
{
   if (r=1)
      {
         if (b>3)
             {
                 if (c<19)
                     {
                         if (Wetter = schön)
                              {
                                    cout << "Jackpot gewonnen"
                              }
                     }
             }
      }
}

Das sieht jetzt erstmal blöde aus und dabei habe ich noch die ganzen else bedinungen weggelassen... aber andererseits frage ich mich was eigentlich schneller ist.

Das erste Beispiel würde ja immer alles prüfen... wohingegen das zweite Beispiel nur immer die fälle prüft die vielversprechend genug sind um als jackpot in Frage zu kommen.

Gefühlsmässig würde ich ja immer boolsche dinger nehmen (schon aus faulheit) aber schneller müsste bei sehr hohen durchlaufzahlen (prüfzyklen) doch die verschachtelung sein, oder?


Nelrim
Auch der längste Weg beginnt mit einem ersten Schritt.

Databyte

Alter Hase

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

2

11.02.2008, 13:47

Da das ja noch compiled wird, glaube ich nicht das da ein so großer Geschwindigkeitsunterschied
vorhanden ist...
Außerdem bricht er auch bei && ab ( soweit ich weiß )

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

3

11.02.2008, 13:50

Bei logischen Verknüpfungen prüft er nur solange, bis er ein eindeutiges Ergebnis hat:
http://msdn2.microsoft.com/en-us/library/fw2wy787.aspx
http://msdn2.microsoft.com/en-us/library/c6s3h5a7.aspx

Zitat

The first operand is completely evaluated and all side effects are completed before continuing evaluation of the logical AND expression.

The second operand is evaluated only if the first operand evaluates to true (nonzero). This evaluation eliminates needless evaluation of the second operand when the logical AND expression is false.


P.S: MSDN kann echt hilfreich sein. Einfach bei google "msdn + suchbegriffe" eingeben und los gehts ;)
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

4

11.02.2008, 13:51

1. Denke ich,dass das nicht das Problem sein wird in einem Spiel, wo die Geschwindigkeit Probleme macht. ;)

Und 2. Habe ich auch im Kopf, dass die Bedingung abbricht auch wenn es mit logischen Operatoren zusammen nimmst.

Nelrim

Frischling

  • »Nelrim« ist der Autor dieses Themas

Beiträge: 33

Beruf: Entwicklungskonstrukteur

  • Private Nachricht senden

5

11.02.2008, 14:09

Zitat von »"Nox"«

Bei logischen Verknüpfungen prüft er nur solange, bis er ein eindeutiges Ergebnis hat:
http://msdn2.microsoft.com/en-us/library/fw2wy787.aspx
http://msdn2.microsoft.com/en-us/library/c6s3h5a7.aspx

Zitat

The first operand is completely evaluated and all side effects are completed before continuing evaluation of the logical AND expression.

The second operand is evaluated only if the first operand evaluates to true (nonzero). This evaluation eliminates needless evaluation of the second operand when the logical AND expression is false.


P.S: MSDN kann echt hilfreich sein. Einfach bei google "msdn + suchbegriffe" eingeben und los gehts ;)


ah cool, wieder was gelernt!

dankeschön.

geht der also immer von links nach rechts?

dann würde es ja sinn machen die unwahrscheinlichsten ereignisse einer boolschen verkettung immer an den Anfang zu stellen.

Nelrim
Auch der längste Weg beginnt mit einem ersten Schritt.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

11.02.2008, 14:46

Re: Theoretische Frage zu Geschwindigkeit und boolschen Oper

Zitat von »"Nelrim"«


Das erste Beispiel würde ja immer alles prüfen... wohingegen das zweite Beispiel nur immer die fälle prüft die vielversprechend genug sind um als jackpot in Frage zu kommen.


Nein, das erste Beispiel prüft nicht alles, sondern bis der gesamte Ausdruck als "wahr" gewertet wird, oder eine Kondition als "falsch".
Zum Beispiel:

C-/C++-Quelltext

1
2
3
4
bool a = false;
bool b = true;

if ( a && b );


Der Compiler prüft a auf die Wertigkeit "wahr". Schlägt der Test fehl ist die If-Bedingung nicht erfüllt.

Das kann auch genutzt werden um auf Null-Zeiger zu testen:

C-/C++-Quelltext

1
2
3
foo* p = null;

if ( p && p->foobar() );


Würde hier jeder Test ausgeführt, landete das Programm schnell in einem undefinierten Verhalten. Stattdessen wird die Bedingung als nicht erfüllt angesehen wenn p == 0 ist.

Es macht daher lediglich Sinn die Bedingungen nach Abhängigkeit, und danach wie wahrscheinlich eine Bedingung ist, zu ordnen. Nicht aber unübersichtliche, verschachtelte If-Bedingungsbäume zu erstellen.
@D13_Dreinig

7

11.02.2008, 14:46

nach bindungsstärke und von links nach rechts ...
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Werbeanzeige