Die Klasse sieht nun wie folgt aus:
Delphi-Quellcode:
TVariable<T> = Class
private type
PVariable = ^T;
private
fVarSize: Integer;
fDimensions: TDimArray;
fPData: PByte;
fMemSize: Integer;
public
constructor Create(AName: AnsiString; const ADimensions: TDimArray); virtual;
property Value_: T read GetValue write SetValue;
property Value[x: Integer]: T read GetValue1D write SetValue1D; default;
property Value[x,y: Integer]: T read GetValue2D write SetValue2D; default;
property Value[x, y, z: Integer]: T read GetValue3D write SetValue3D; default;
End;
Bis auf die Value_ property sieht das schon recht gut aus.
Zeitmessungen habe ich auch gemacht jeweils 800000 Zugriffe auf ein 10*3 Integer Array
Version mit Value[[x,y]] : ~2400ms
Version mit Value[x,y] : ~180ms
Zusätzlich habe ich auch das mit einem TDictionary ausprobiert:
Mit IntToStr(x)+'-'+IntToStr(y): ~9200ms
Mit (x Shl 16 + y) als Index: ~3400ms
Ein Problem bleibt noch mit der Unterscheidung zwischen:
Delphi-Quellcode:
Type
TEnumEntry = AnsiString;
und "normalen" AnsiStrings. Beides soll als Array angelegt werden können, intern aber anders gehandhabt werden. AnsiStrings sind in Wirklichkeit Strings mit fixer Länge und können direkt abgelegt werden während TEnumEntry Strings mit varibler Länge sind und im Speicher einfach als Offsets auf ihre Position dahinter abgelegt werden sollen.
Leider ist aber TypeOf(T) = TypeOf(TEnumEntry) = TypeOf(AnsiString). Daher suche ich nun eine Möglichkeiten die beiden Varianten zu unterscheiden?