GVars in einen Enumerator packen?

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Hi,


    ich hab mich gefragt, ob es einen Unterschied macht ob ich nun alle globalen Variablen "roh" deklariere,...
    new GVar1[MAX_PLAYERS];
    new bool:GVar2;
    new Float:GVar3[3];
    new Gvar4;
    ...oder sie allesamt in einen Enumerator packe?
    enum gVars
    {
    GVar[MAX_PLAYERS],
    bool:GVar2,
    Float:GVar3[3],
    GVar4
    }
    new GVar[gVars];


    Danke!

  • Die erste Variante (einzelne Variablen/Arrays) ist besser hinsichtlich der CPU-Belastung, da der Zugriff auf Arrays grundsätzlich langsamer ist (Variablen mit enums sind Arrays).


    Das bestätigt auch der Zeit-Test beim setzen von GVar4 auf 1, 10.000.000 mal hintereinander:

    Code
    [25/06/2015 22:44:49] Ohne Enum: 177ms
    [25/06/2015 22:44:49] Mit Enum: 245ms
  • Wenn, dann hat die enum-Variante ebenso minimal mehr Memoryverbrauch, anonsten macht es keinen Unterschied, da für die Werte der gleiche Speicherplatz reserviert wird, nur eben an einem Stück.


    new a, b, c, d;
    Verbraucht gleich viel Speicher wie
    new abcd[4];


    Nur musst du natürlich bedenken, dass die Werte im enum-Bereich auch Speicher verbrauchen (jede Zeile im enum stellt im Prinzip eine Zahl dar). Daher braucht die enum Variante minimal mehr Speicher.


    Also von der Performance ist es auf jeden Fall besser einzelne Variablen zu verwenden und dem enum aus dem Weg zu gehen.

  • Alles klar, danke für die Klarstellung!


    Dann versteh ich die Aufregung mancher nicht mehr, wenn man mal...
    new Float:x;
    new Float:y;
    new Float:z;
    ...anstatt...
    new Float:pos[3];
    schreibt, wenn sich das sowieso nichts nimmt.

  • wenn sich das sowieso nichts nimmt.


    Durch einen Array zu loopen oder darin zu sortieren ist wesentlich einfacher als mit Variablen.
    Zu dem ist der Schreibaufwand wesentlich geringer.

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • Das verstehe ich auch nicht, liegt wohl am Stur-Sinn mancher. Weniger zu schreiben ist in diesem Fall eben nicht besser, da ein Array-Zugriff eben langsamer ist.
    Ungeachtet dessen nutze ich trotzdem immer die erste Variante (bezogen auf das x,y,z), da es wesentlich schneller und einfacher zu schreiben ist, man spart sich die eckigen Klammern. Arrays sollte man nur nutzen, wenn sie auch Sinn ergeben. Natürlich geht man jetzt nicht hin und macht 200 Variablen die dann heißen "pSkin1, pSkin2, ..., pSkin200". Das wäre Quatsch. :D


    Grundsätzlich sei aber noch anzumerken, dass die Unterschiede natürlich minimal sind, auch wenn es im Zeitvergleich recht deutlich aussieht, nur wer macht 10 Millionen Aufrufe auf einmal. Rechnest du das um auf sagen wir 100ms pro 10 Millionen aufrufe, dann entspricht das 1 Sekunde pro 100 Millionen Aufrufe, das entspricht einer hundert-millionstel Sekunde pro Aufruf.

  • Eine etwas weiterführende Frage: In welchen zeitlichen Dimensionen bewegen wir uns, wenn wir davon reden, dass der Compiler eine Zeile im Vergleich zu z.B. 10.000 Zeilen parst? Man spricht ja ständig davon möglichst zeilensparend zu scripten - hängt das mit der Zeit für das Parsen zusammen?

  • Im normalen Bereich (wenn wir davon ausgehen, dass du für einen /clearchat Befehl nicht 10000 SendClientMessages nacheinander in den Code packst, ohne Schleife), spielt das keine merkliche Rolle.
    Genau weiß ich das nicht, da es auch nur schwer zu testen ist, aber generell geht das so schnell, das spielt keine Rolle. Wichtiger ist es, den Code leserlich zu schreiben.