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

C--

Alter Hase

  • »C--« ist der Autor dieses Themas

Beiträge: 465

Beruf: Schüler

  • Private Nachricht senden

1

25.08.2009, 21:08

Perfomancefrage zu if - else

Ich habe ne Frage, gibt es hierbie einen Geschwindigkeitsunterschied?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
void Test(const int bla, int *b)
{
  if (bla == 7)
  {
    *b = 0;
  }
  else
  {
    *b = 1;
  }
}


oder:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
void Test(const int bla, int *b)
{
  if (bla == 7)
  {
    *b = 0;
    return;
  }

  *b = 1;
}


Weiss einer das zufällig?
mfg C--
Ich spreche: C/C++, C++/CLI C#, VBA, VB.NET, Delphi, (HTML, Javascript(bisschen))
------------------------------------------------------------
Hier steht eventuell schon in ein paar Monaten der Link zu meiner Homepage!

return 0;
;)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

25.08.2009, 21:11

Naja im Zweifelsfall schau dir halt den Assemblercode den der Compiler erzeugt an. Allerdings denk ich mal dass beide Varianten von da oben den gleichen Code erzeugen werden und es da keinen Unterschied gibt...

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

3

25.08.2009, 21:16

Machs doch so, ganz Branchfrei:

C-/C++-Quelltext

1
2
3
4
void Test(const int bla, int *b) 
{
    *b = ( bla !=  7 );
}


:p

4

25.08.2009, 21:22

Das wird kaum etwas ausmachen, ein else ist ja keine Abfrage.

Ausserdem ist das const int als Parametertyp etwas fragwürdig, int würde es genauso tun. Begründung siehe hier.

C--

Alter Hase

  • »C--« ist der Autor dieses Themas

Beiträge: 465

Beruf: Schüler

  • Private Nachricht senden

5

25.08.2009, 21:57

Zitat von »"Nexus"«

Das wird kaum etwas ausmachen, ein else ist ja keine Abfrage.

Ausserdem ist das const int als Parametertyp etwas fragwürdig, int würde es genauso tun. Begründung siehe hier.


sry, ich hatte dort erst versehentlich const int &bla stehen, bis ich gemerkt hab das eine Reference schwachsinn ist, hab vergessen const zu entfernen.

@dot: Kann nicht so gut Assembler :oops:
Ich spreche: C/C++, C++/CLI C#, VBA, VB.NET, Delphi, (HTML, Javascript(bisschen))
------------------------------------------------------------
Hier steht eventuell schon in ein paar Monaten der Link zu meiner Homepage!

return 0;
;)

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

6

25.08.2009, 22:22

Wenn dich die Frage nicht rein technisch interessiert, dann ist dafüber nachzudenken völliger Mist. ;) - Du hast schon wesentlich mehr Zeit verloren darüber nachzudenken, ob das jetzt zeitsparender sein könnte, als du jemals herausholen könntest. (Sprich Entwicklungszeit ist drauf gegangen für nichts und wieder nichts, weil du die Zeit besser später einsetzt, wo wirklich Optimierung angesagt ist).

Siehe Knuth:
http://en.wikipedia.org/wiki/Optimization_%28computer_science%29#When_to_optimize

Um jetzt nicht eine Optimierungsdiskussion auszulösen (was wir schon zu oft hatten) sei hier noch gesagt, dass es nicht grundsäztlich falsch ist sich über solche Sachen Gedanken zu machen. Man sollte es einfach nicht unter dem Vorwand der Optimierung tun, sondern des reinen Interessens und Neugierde, dann geht nämlich auch keine Zeit verloren)

C--

Alter Hase

  • »C--« ist der Autor dieses Themas

Beiträge: 465

Beruf: Schüler

  • Private Nachricht senden

7

26.08.2009, 12:21

Zitat von »"drakon"«

Um jetzt nicht eine Optimierungsdiskussion auszulösen (was wir schon zu oft hatten) sei hier noch gesagt, dass es nicht grundsäztlich falsch ist sich über solche Sachen Gedanken zu machen. Man sollte es einfach nicht unter dem Vorwand der Optimierung tun, sondern des reinen Interessens und Neugierde, dann geht nämlich auch keine Zeit verloren)


Ich wollte das jetzt eigentlich nur generell wissen, dann könnte man sich das gleich "schnellere" angewöhnen und hat nicht zum Schluss 100te if-else-Zweige zu verändern.

zum Thema:
im asm sehe ich am Anfang der zwei .obj-Dateien einen unterschied, weiss aber nicht, ob das wirklich was mit dem if else zu tun hat:

Methode1:

Quellcode

1
2
3
4
5
00000000  4C                dec sp
00000001  0107              add [bx],ax
00000003  009C4594          add [si+0x9445],bl
00000007  4A                dec dx
00000008  0E                push cs


Mehode2:

Quellcode

1
2
3
4
5
6
00000000  4C                dec sp
00000001  0107              add [bx],ax
00000003  007646            add [bp+0x46],dh
00000006  94                xchg ax,sp
00000007  4A                dec dx
00000008  0E                push cs
Ich spreche: C/C++, C++/CLI C#, VBA, VB.NET, Delphi, (HTML, Javascript(bisschen))
------------------------------------------------------------
Hier steht eventuell schon in ein paar Monaten der Link zu meiner Homepage!

return 0;
;)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

26.08.2009, 13:05

Assembler ist eigentlich ziemlich einfach, vor allem zu lesen, man braucht nur viel Gedult und ne Doku der CPU ;)

Zur Demonstration was MSVC in nem normalen Standard Setup im Release Mode aus deinem Code machen würde, folgendes Programm (lass dich von dem volatile nicht verwirren, das dient nur dazu den Compiler daran zu hindern alles wegzuoptimieren, der würde sonst nämlich einfach ein int main() { return 0; } draus machen ;) ):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void Test(int bla, int *b) 
{ 
  if (bla == 7) 
  { 
    *b = 0; 
  } 
  else 
  { 
    *b = 1; 
  } 
}


volatile int blub = 7;

int main()
{
  int bla = blub;
  int b;

  Test(bla, &b);

  return b;
}


Liefert folgenden asm Output:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main()
{
  int bla = blub;
013A1000  mov         eax,dword ptr [blub (13A3018h)] 
  int b;

  Test(bla, &b);
013A1005  xor         ecx,ecx 
013A1007  cmp         eax,7 
013A100A  setne       cl   
013A100D  mov         eax,ecx 

  return b;
}
013A100F  ret       


Und mit der anderen Variante der Test() Funktion:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main() 
{ 
  int bla = blub; 
00A91000  mov         eax,dword ptr [blub (0A93018h)]    // hol den Wert von blub ins eax Register 

  int b; 

  Test(bla, &b); 
00A91005  xor         ecx,ecx   // Setze ecx auf 0 

00A91007  cmp         eax,7     // Vergleiche eax (blub) mit 7 

00A9100A  setne       cl        // wenn eax (blub) != 7 setze ecx auf 1 

00A9100D  mov         eax,ecx   // gib das Ergebnis zurück 


  return b; 
} 
00A9100F  ret    // return


Wie man unschwer erkennen kann ist der Code in beiden Fällen identisch (Bei der Variante von David_pb komm übrigens auch das selbe raus ;) )...

C--

Alter Hase

  • »C--« ist der Autor dieses Themas

Beiträge: 465

Beruf: Schüler

  • Private Nachricht senden

9

26.08.2009, 13:10

Zitat von »dot«

Liefert folgenden asm Output:

Code (C++):
int main()
{
int bla = blub;
013A1000 mov eax,dword ptr [blub (13A3018h)]
int b;

Test(bla, &b);
013A1005 xor ecx,ecx
013A1007 cmp eax,7
013A100A setne cl
013A100D mov eax,ecx

return b;
}
013A100F ret



Wie kriegst du son output, wo kann man den finden?

Ich hab nur die .obj durch den disasm von nasm gejagt und ein haufen Zeilen gekriegt
Ich spreche: C/C++, C++/CLI C#, VBA, VB.NET, Delphi, (HTML, Javascript(bisschen))
------------------------------------------------------------
Hier steht eventuell schon in ein paar Monaten der Link zu meiner Homepage!

return 0;
;)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

26.08.2009, 13:13

Visual Studio ist halt einfach zu geil ;)
Im Debugger einfach Breakpoint in main() setzen, anwerfen und dann Rechtsklick -> Go to Disassembly (Du kannst den asm dann auch live debuggen ;) )... Außerdem kann man den MSVC Compiler so einstellen dass er einem nen asm Output liefert der genau so aussieht (Projekteigenschaften bei C++ unter Output Files Assembler Output auf Assembly with Source Code stellen).

Werbeanzeige