Performance Fragen (Datentypen, struct)



  • Hallo,

    ich möchte meine Grafikanwendung so performant machen wie es nur geht.
    Da ich in diesem Bereich nur begrenzt Erfahrung habe, stellen sich mir einige Fragen:

    Ich habe in meinem Programm extrem viele niedrige ganze Zahlen. Eigentlich gibt es drei verschiedene Typen von Wertebereichen:

    [0, 4]
    [0, 255]
    [0, 511]

    Welcher Datentyp ist hier jeweils am besten geeignet, wenn die Zahlen in sehr großer Menge gespeichert werden?

    Wie verhalten sich unsigned char, short und int was die Speicherung betrifft?
    Ist es wirklich lohnenswert den jeweils "kleinsten" Datentyp zu wählen, oder macht das auch bei massiver Nutzung keinen merkbaren Unterschied?

    Wäre es sinnvoll, für einen Wertebereich von [0, 4] eine enumeration einzusetzen, oder wird das intern sowieso z.B. als int gespeichert?

    Dann noch eine Frage zu struct und class:

    macht es einen Geschwindigkeitsunterschied, ob man z.B. einen Vektor in einer Klasse speichert und über einen getter an die einzelnen Elemente kommt,
    oder ob man den Vektor in einem struct speichert und die Werte dann über "v.x" addressiert? Alles ist wohlgemerkt unter massiver Nutzung zu betrachten.

    Ich würde mich über Eure Antworten freuen!



  • Grundlegend sei gesagt, dass man ein Programm nicht so nach gutdünken optimiert. Diese Frage nach den Wertebereichen ist erstens völliger Quatsch, da es z.B bei kleiner Typen gleich viel Aufwand braucht, wie grösseren. (je nach implementierung) und anderseits hast du viel grössere Probleme, als ein paar Variablen Grösse. 😉

    Mach dir im Programmcode keine solchen Optimierungsgedanken, da es nix bringt, sondern wähle die Typen so, wie es für das Programm das beste ist und am Ende benutzt du einen Profiler (z.B Codeanalyst), um die Engpässe zu finden und dann kannst du solche Optimierungen vornhemen.



  • Danke für Deine Antwort!

    Wenn es - wie du sagst - total egal ist, welchen Datentyp man benutzt, dann drängt sich mir die Frage auf: warum gibt es sie überhaupt? 😉

    Es geht in meinem Fall ja nicht um Berechungen, sondern um die bloße Speicherung.
    Is es dann wirklich egal, ob ich 20 mio Integer, Short oder Char speichere?
    Für char werden ja glaube ich nur 8 Bit reserviert - bei int sind es doch 32, oder?

    Da ich einen Intel Prozessor habe, eignet sich der Codeanalyst wohl nur begrenzt. 😉
    Meine Suche nach ergonomischen Profilern blieb leider bislang erfolglos.

    mfg, troobee (aka dataType 😉 )



  • Klar sind die Datentypen nicht egal, aber sie sind nicht nur da, um die Performance zu optimieren, sondern ebenfalls um Fehlern vorzubeugen. Du solltest dir Datentypen aber nicht so wählen, weil du Angst hast, dass sie längsemer sind, sondern, wie ihre Eigenschaften sind. (z.B benutze einen unsigned , wenn keine negativen Werte vorkommen können usw.)

    Dazu kommt noch, dass die Grösse abhängig von der Implementierung ist. Aber normalerweise sind char wohl 8 Bit und int 32 Bit, ja.

    Das geht ja soweit, dass ja dynamische Sprachen Datentypen auch völlig vernachlässigen und die Optimierung der Typen erst später stattfindet, aber das ist ein anderes Thema. 😉

    Ich habe selbst einen Intel Prozessor und es ist möglich mit dem Codeanalyst zu profilen. Es mag sicher nicht optimal sein, aber besser als gar nichts ist es auf jeden Fall. Vor allem, weil ich wirkliche Engpässe ausfindig machen konnte.
    Wenn es etwas bessers gibt, höre ich gerne zu. 😉
    Unter Linux soll Valgrind ja auch noch ganz gut sein.


  • Mod

    Beachte das, was Drakon gesagt hat. da du es aber trotzdem nicht tun wirst, ein paar Hinweise:

    Wie verhalten sich unsigned char, short und int was die Speicherung betrifft?
    Ist es wirklich lohnenswert den jeweils "kleinsten" Datentyp zu wählen, oder macht das auch bei massiver Nutzung keinen merkbaren Unterschied?

    Das darauf an, was du machst: Mit dem Standardinteger wird bei den meisten Implementierungen am schnellsten gerechnet, dafür braucht er mehr Speicherplatz. Ist Rechenzeit das Problem, ist also der int Typ besser, ist Speicherplatz oder Speicherperformance das Problem, können kleinere Typen helfen. Dies gilt für die meisten Prozessortypen, ist aber kein allgemeines Prinzip.

    Wäre es sinnvoll, für einen Wertebereich von [0, 4] eine enumeration einzusetzen, oder wird das intern sowieso z.B. als int gespeichert?

    enum ist dazu da, dir das Programmieren zu erleichtern. enumerations haben aber keine besonderen Assemblerbefehle, sie werden mit den Standardmitteln so umgesetzt wie der Compilerbauer es für sinnvoll hält.

    Dann noch eine Frage zu struct und class:

    macht es einen Geschwindigkeitsunterschied, ob man z.B. einen Vektor in einer Klasse speichert und über einen getter an die einzelnen Elemente kommt,
    oder ob man den Vektor in einem struct speichert und die Werte dann über "v.x" addressiert? Alles ist wohlgemerkt unter massiver Nutzung zu betrachten.

    Höchstens wenn du explizit ohne Optimierung compilierst, getter und setter sind sehr leicht wegzuoptimieren. Du willst hier wieder den Fehler machen, die saubere Programmierung voreilig zugunsten nichtsbringender Optimierung aufzugeben.


Anmelden zum Antworten