Kokujou schrieb:
Ich dachte Dictionaries sind eine gute Lösung weil sie schnellen Zugriff versprechen. Da ich auch mit starken Laufzeitproblemen zu kämpfen habe war das eine Optimierung.
Dictionaries sind nicht zwingend schneller. Wenn du einfach alle Werte iterierst, sind Listen schneller. Wenn du Lookups auf bestimmte Werte brauchst, können Listen schneller sein, wenn die Anzahl der Elemente klein ist.
Bei einer HashTable (das ist ein Dictionary), müssen Werte berechnet (gehasht) werden um zum Element zu gelangen. Das kostet Rechenzeit. Unter anderem hierfür hat jedes Objekt in C# die
GetHashCode
-Methode.
Kokujou schrieb:
Short oder Byte wäre eine Lösung aber das ist eigentlich völlig egal da die sowieso beim Rechnen in int gecastet werden, wie ich hörte. Und damit wirkt sich das kaum auf die Laufzeit aus
Heute CPUs berechnen dir 64-bit Integers (in C#
long
) in einer Instruktuion.
byte
,
short
etc. sind dann sinnvoll, wenn du millionen an Werten hast und so RAM sparen kannst oder wenn es fachlich schöner ist: "Der Wert einer Farbe eines Pixels kann zwischen 0 und 255 sein".
new Account() schrieb:
Passt doch eher als int: Monate sind 1 - 12, d.h. immer positiv.
Oder noch schöner (wie es glaube ich sogar gelöst ist, wenn ich mich richtig erinnere): ein Enum. Bei integern weiß man sonst nie "war Januar nun 0 oder doch 1?". Ein Paradabeispiel dafür: Das
Date
Object in JavaScript. Der erste Monat im Jahr ist 0, der erste Tag im Monat ist 1 und der Montag wieder 0 (oder war es doch andersrum?
)
Nachtrag:
30 Sekunden sind vergangen, seit dem ich mir den Code anschaue und schon finde ich sowas:
https://github.com/Kokujou/Hanafuda...ernal/Scripts/KI/Omniscient/Omniscient.cs#L23
So müssen nun in jeder
Berechnung mehrere Lookups gemacht werden. Ich weiß nun zwar nicht wie oft die Berechnung ausgeführt wird, aber wenn es (sehr) häufig ist, dann hast du hier auf jeden fall ins negative optimiert.
Da deine verfügbaren Weights nicht dynamisch sind, wäre hier eine "[Scope]WeightsConfiguration"-Klasse oder alternative die Variablen direkt in der
OmniscientAI
Klasse in jeder hinsicht sinnvoller. Du brauchst keine Lookups, du musst nicht
mit Strings arbeiten (strings sind verglichen mit Integern und der direkten Nutzung von Variablen sau lahm), und du hast keine Methoden,
die nicht das machen, was man von ihnen erwatet (
SetWeight("foobar", 123)
).
Da du sagst, dass du Performance-Probleme hast: Der sinvollste weg dem hier zu begegnen ist die selbe Antwort wie auch schon beim RAM-Verbrauch: Profiling. Sonst läufst du gefahr, dass du stellen optimierst, die gar kein Problem darstellen (wie es bei meinem Beispiel gerade auch sein kann und wohl auch sein wird).