Autor Beitrag
Aya
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: Mo 09.02.09 03:31 
Hi,

ich hab noch ein paar performance fragen bezüglich C++.
Zur info, hier geht es mehr oder weniger um millisekunden, bzw noch weniger.. aber in meinem fall ist jede millisekunde wichtig! :)

1)
Ich habe eine funktion die eine Farbe (ein Struct aus 4 Floats) zurückliefern muß. Diese wird mehrere millionen mal aufgerufen, etwa so:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
CColor doSomething() {
  CColor result;
  result = something();
  retur result;
}

[....]
CColor c;
for (int i = 0; i < 10000000; i++)
  c += doSomething();



Ist es da ein geschwindigkeits unterschied wenn ich das ganze so umstelle?

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
void doSomething(CColor &c) {
  c = something();
}

[....]
CColor c, x;
for (int i = 0; i < 10000000; i++) {
  doSomething(x);
  c += x;
}


Sprich, macht es einen geschwindigkeits unterschied ob ich in jedem funktionsaufruf eine neue CColor erstelle oder eine übernehme die ich als reference-parameter bekomme? Oder optimiert der compiler das eh weg?


2)
Macht es einen geschwindigkeitsunterschied ob ich einer funktion parameter als referenz oder als pointer übergebe?

ausblenden C#-Quelltext
1:
2:
3:
void doSomething(CColor &c) {
  c.bla();
}


oder:

ausblenden C#-Quelltext
1:
2:
3:
void doSomething(CColor *c) {
  c->bla();
}



3)
Ähnlich wie erstens, ist hier ein unterschied?

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
CColor x;
for (int i = 0; i < 10000; i++) {
  CColor c = bla();
  x += c;
}


und:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
CColor x, c;
for (int i = 0; i < 10000; i++) {
  c = bla();
  x += c;
}


Das ich hier nicht diret "x += bla()" mache liegt nur am beispiel, es geht nur um das erstellen eines neuen color-objekts in der for-schleife.. oder wird das sowieso wegoptimiert?


Aya


PS: Hab das gleiche auch im DelphiGL-Forum gefragt: www.delphigl.com/for...iewtopic.php?p=68824

_________________
Aya
I aim for my endless dreams and I know they will come true!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 09.02.09 08:28 
Ich würde sagen das kommt vielleicht auch auf den Compiler an, aber da es sich um eine Klasse handelt müsste diese eigentlich ja jedesmal neu erzeugt werden, was natürlich langsamer wäre.

Jedenfalls wollte ich es eigentlich gerade nachschauen wie es ist, nur leider habe ich gerade im Visual Studio 2008 den Assembler Code beim Debuggen nicht gefunden. :shock:
Irgendwie scheint der da etwas versteckt zu sein, was ja nicht besonders sinnvoll ist. Den C++ Builder habe ich gerade nicht installiert auf diesem PC, das werde ich dann nachher testen.
Greenberet
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 339
Erhaltene Danke: 20

Win 10
C# (VS 2012), C++ (VS 2012/GCC), PAWN(Notepad++), Java(NetBeans)
BeitragVerfasst: Mo 09.02.09 13:54 
1)Ich muss hier meinem Vorposter recht geben.
Wenn du in "doSomething" die Variable immer wieder neu erzeugst, dann ist das ein Performance verlust, weil du das Objekt jedes mal am Stack erzeugst, und am Ende der Funktion wieder löscht( fürs return wird eine Kopie erzeugt ).
Da ist dein 2ter Codeschnipsel mit der Referenz schneller weil er das Objekt nur einmal erzeugt und dann nur noch einen Pointer übergibt und dein Objekt einfach nur jedes mal abändert.

2) Referenz == Pointer ;)
Der einzige Unterschied besteht hier im Prinzip nur beim Programmieren bzw. beim Compilieren. Zur Laufzeit is der Code dann identisch ( wenn ich mich recht erinner *gg* )

3)Im Prinzip wie Punkt 1, nur dass das Objekt bei jedem Schleifendurchlauf in der Schleife anstatt in der Funktion erstellt und gelöscht wird.