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

1

26.03.2007, 20:31

Tribase Performancefrage

Das hier hat zwar eher etwas allgemein mit C++ zu tun, aber ich stelle die Frage trotzdem hier wegen dem Bezug zur Tribase Engine.

Folgende Funktion:

C-/C++-Quelltext

1
2
3
4
5
6
7
TRIBASE_API tbMatrix tbMatrixTranslation(const tbVector3& v)
{
    return tbMatrix(1.0f, 0.0f, 0.0f, 0.0f,
                    0.0f, 1.0f, 0.0f, 0.0f,
                    0.0f, 0.0f, 1.0f, 0.0f,
                    v.x,  v.y,  v.z,  1.0f);
}


Wird hier nicht zuerst eine lokale tbMatrix Kopie erzeugt und die dann auf den Stack gelegt um sie dann an die aufrufende Prozedur zu übergeben. Danach wird dann die lokale Kopie zerstört. Das ist doch ziemlich langsam. Wäre es da nicht besser auf einen Zeiger zurück zu greifen?

Aber ich nehme das läuft anders ab. Ansonsten würde David ja alles über den Haufen werfen, was Heiko gepredigt hat ;)

big_muff

Alter Hase

Beiträge: 460

Wohnort: Schweiz

Beruf: Informatikstudent (4. Semester)

  • Private Nachricht senden

2

26.03.2007, 20:35

Durch Returnwertoptimierung was mittlerweile jeder Compiler bei solchen einfachen Funktionen können sollte, muss keine lokale Kopie erzeugt werden. Ausserdem, wenn du einen Zeiger zurückgibst, dann muss der auch auf irgendetwas zeigen und dieses etwas musst du ja erstellen. Das heisst der Benutzer muss den Zeiger wieder freigegeben. Dies ist insbesondere bei solch einer Funktion, die vielleicht auch schon mal als Argument für eine andere Funktion benützt werden könnte sehr schlecht.
Nur Idioten halten Ordnung, ein Genie beherrscht das Chaos.[size=7]

[/size]HardFate - Ein Start, Ein Ziel, Viele Wege[size=7]

[/size]Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.

3

26.03.2007, 21:09

okay aber hier sieht das ganze schon etwas anders aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
TRIBASE_API tbMatrix tbMatrixRotationX(const float f)
{
    tbMatrix mResult;

    // Rotationsmatrix berechnen

    mResult.m11 = 1.0f; mResult.m12 = 0.0f; mResult.m13 = 0.0f; mResult.m14 = 0.0f;
    mResult.m21 = 0.0f;                                         mResult.m24 = 0.0f;
    mResult.m31 = 0.0f;                                         mResult.m34 = 0.0f;
    mResult.m41 = 0.0f; mResult.m42 = 0.0f; mResult.m43 = 0.0f; mResult.m44 = 1.0f;

    mResult.m22 = mResult.m33 = cosf(f);
    mResult.m23 = sinf(f);
    mResult.m32 = -mResult.m23;

    return mResult;
}


Hier nimmt man also einen kleinen Performanceverlust in Kauf?

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

26.03.2007, 21:43

Nein, schau dir doch einfach den generierten Assembler-Code an.

5

26.03.2007, 22:13

Okay ich habe den Compiler wohl unterschätzt :D

Steven77

Alter Hase

Beiträge: 515

Wohnort: Münster - Gievenbeach

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

28.03.2007, 14:19

Als Anmerkung kann ich noch folgendes hinzufügen: Nicht nur, dass der Speicher eines mit new erzeugten Objekts auch irgendwo wieder freigegeben werden sollte. Zusätzlich sollte man den "Aufwand" des new-Operators nicht unterschätzen. Es schreibt sich so leicht, doch wer mal mit dem Debugger nachvollzieht, was bei einem Aufruf von new alles "in die Wege geleitet" wird... Mein lieber Scholli!
Das nur zur Performance. Selbst wenn etwaiges lokales Stack-Objekt "nach außen hin" kopiert werden müsste, wäre (zumindest in diesem Fall) ein Aufruf des new-Operators wohl noch inperformanter. Mal ganz von der Notwendigkeit der Zerstörung des Objekts abgesehen.
Kommen Sie nie mit einem Schwert zu einer Schießerei.

Werbeanzeige