Skip to content

Commit 9c1da91

Browse files
committed
Micro-optimizations around instance initialization/cleanup
1 parent e8910fa commit 9c1da91

File tree

6 files changed

+144
-16
lines changed

6 files changed

+144
-16
lines changed

Libraries/DatabaseLib/dwsDatabase.pas

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,8 @@ destructor TdwsDataSet.Destroy;
316316
NotifyDestroy(FID);
317317
SetLength(FFields, 0);
318318
FFieldCount := -1;
319+
FDataBase := nil;
320+
319321
inherited;
320322
end;
321323

Libraries/DatabaseLib/dwsDatabaseLibModule.pas

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,7 @@ TDataField = class
183183
vPools : TSimpleNameObjectHash<TDataBaseQueue>;
184184
vPoolsCS : TMultiReadSingleWrite;
185185
vPoolsCount : Integer;
186+
vScriptDataSetCloneConstructor : TClassCloneConstructor<TScriptDataSet>;
186187

187188
// NotifyDataSetCreate
188189
//
@@ -732,7 +733,7 @@ function TdwsDatabaseLib.dwsDatabaseClassesDataBaseMethodsQueryFastEval(
732733
if TdwsDataSet.CallbacksRegistered then
733734
dsID := TdwsDataSet.NotifyCreate(args.Expr)
734735
else dsID := 0;
735-
dataSet := TScriptDataSet.Create;
736+
dataSet := vScriptDataSetCloneConstructor.Create;
736737
try
737738
dataSet.FIntf := dbo.Intf.Query(sql, scriptDyn, args.Expr);
738739
except
@@ -1138,9 +1139,13 @@ initialization
11381139

11391140
vPoolsCS := TMultiReadSingleWrite.Create;
11401141

1142+
vScriptDataSetCloneConstructor.Initialize(TScriptDataSet.Create);
1143+
11411144
finalization
11421145

11431146
vPoolsCS.Free;
11441147
vPoolsCS:=nil;
11451148

1149+
vScriptDataSetCloneConstructor.Finalize;
1150+
11461151
end.

Source/SourceUtils/dwsGabelouStdRules.pas

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -400,8 +400,6 @@ procedure TGR_TypesNaming.EvaluateSymbol(const aSymbolList : TSymbolPositionList
400400
isException := False;
401401

402402
typeSymbol := TTypeSymbol(aSymbolList.Symbol).UnAliasedType;
403-
if typeSymbol is TFuncSymbol then Exit;
404-
405403
if typeSymbol is TClassSymbol then begin
406404
classSymbol := TClassSymbol(typeSymbol);
407405
while classSymbol.Parent <> nil do begin

Source/dwsDynamicArrays.pas

Lines changed: 131 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ TScriptDynamicDataArray = class (TDataContext, IScriptDynArray)//(TInterfaced
7070
function SetFromExpr(index : NativeInt; exec : TdwsExecution; valueExpr : TExprBase) : Boolean;
7171

7272
public
73+
procedure FreeInstance; override;
7374

7475
function ScriptTypeName : String; override;
7576

@@ -112,8 +113,13 @@ TScriptDynamicDataArray = class (TDataContext, IScriptDynArray)//(TInterfaced
112113
property AsString[index : NativeInt] : String write SetAsString;
113114
end;
114115

115-
TScriptDynamicValueArray = class (TScriptDynamicDataArray)
116+
TScriptDynamicValueArray = class sealed (TScriptDynamicDataArray)
116117
public
118+
class function NewInstance: TObject; override;
119+
120+
class procedure PrepareInstanceTemplate; static;
121+
class procedure ReleaseInstanceTemplate; static;
122+
117123
procedure Swap(i1, i2 : NativeInt); override;
118124
end;
119125

@@ -356,6 +362,7 @@ TScriptDynamicNativeBaseInterfaceArray = class (TScriptDynamicNativeArray)
356362

357363
public
358364
class function InterfaceToDataOffset : Integer; override; final;
365+
procedure FreeInstance; override;
359366

360367
procedure SetArrayLength(n : NativeInt);
361368

@@ -413,8 +420,13 @@ TScriptDynamicNativeInterfaceArray = class (TScriptDynamicNativeBaseInterface
413420
procedure AddFromExpr(exec : TdwsExecution; valueExpr : TExprBase);
414421
function SetFromExpr(index : NativeInt; exec : TdwsExecution; valueExpr : TExprBase) : Boolean;
415422
end;
416-
TScriptDynamicNativeObjectArray = class (TScriptDynamicNativeBaseInterfaceArray, IScriptDynArray)
423+
TScriptDynamicNativeObjectArray = class sealed (TScriptDynamicNativeBaseInterfaceArray, IScriptDynArray)
417424
public
425+
class function NewInstance: TObject; override;
426+
427+
class procedure PrepareInstanceTemplate; static;
428+
class procedure ReleaseInstanceTemplate; static;
429+
418430
procedure AddFromExpr(exec : TdwsExecution; valueExpr : TExprBase);
419431
function SetFromExpr(index : NativeInt; exec : TdwsExecution; valueExpr : TExprBase) : Boolean;
420432
end;
@@ -492,7 +504,8 @@ TScriptDynamicNativeBooleanArray = class (TScriptDynamicNativeArray, IScriptD
492504
procedure WriteToJSON(writer : TdwsJSONWriter);
493505
end;
494506

495-
procedure CreateNewDynamicArray(elemTyp : TTypeSymbol; var result : IScriptDynArray);
507+
function CreateNewDynamicArray(elemTyp : TTypeSymbol) : TInterfacedObject; overload;
508+
procedure CreateNewDynamicArray(elemTyp : TTypeSymbol; var result : IScriptDynArray); inline; overload;
496509

497510
// ------------------------------------------------------------------
498511
// ------------------------------------------------------------------
@@ -535,9 +548,9 @@ procedure DynamicArrayAddStrings(const dyn : IScriptDynArray; sl : TStrings);
535548
dyn.AsString[i+n] := sl[i];
536549
end;
537550

538-
// CreateNewDynamicArray
551+
// CreateNewDynamicArray (func)
539552
//
540-
procedure CreateNewDynamicArray(elemTyp : TTypeSymbol; var result : IScriptDynArray);
553+
function CreateNewDynamicArray(elemTyp : TTypeSymbol) : TInterfacedObject;
541554
var
542555
size : Integer;
543556
ct : TClass;
@@ -565,6 +578,13 @@ procedure CreateNewDynamicArray(elemTyp : TTypeSymbol; var result : IScriptDynAr
565578
end else Result := TScriptDynamicDataArray.Create(elemTyp);
566579
end;
567580

581+
// CreateNewDynamicArray (proc IScriptDynArray)
582+
//
583+
procedure CreateNewDynamicArray(elemTyp : TTypeSymbol; var result : IScriptDynArray);
584+
begin
585+
result := CreateNewDynamicArray(elemTyp) as IScriptDynArray;
586+
end;
587+
568588
// ------------------
569589
// ------------------ TScriptDynamicDataArray ------------------
570590
// ------------------
@@ -723,6 +743,14 @@ function TScriptDynamicDataArray.SetFromExpr(index : NativeInt; exec : TdwsExecu
723743
end else Result := False;
724744
end;
725745

746+
// FreeInstance
747+
//
748+
procedure TScriptDynamicDataArray.FreeInstance;
749+
begin
750+
ClearData;
751+
FreeMemory(Self);
752+
end;
753+
726754
// AddStrings
727755
//
728756
procedure TScriptDynamicDataArray.AddStrings(sl : TStrings);
@@ -975,6 +1003,43 @@ function TScriptDynamicDataArray.GetElementType : TTypeSymbol;
9751003
// ------------------ TScriptDynamicValueArray ------------------
9761004
// ------------------
9771005

1006+
// NewInstance
1007+
//
1008+
var
1009+
vDynamicValueArrayInstanceTemplate : Pointer;
1010+
class function TScriptDynamicValueArray.NewInstance: TObject;
1011+
begin
1012+
if vDynamicValueArrayInstanceTemplate = nil then begin
1013+
Result := inherited NewInstance;
1014+
vDynamicValueArrayInstanceTemplate := GetMemory(InstanceSize);
1015+
System.Move(Pointer(Result)^, vDynamicValueArrayInstanceTemplate^, InstanceSize);
1016+
end else begin
1017+
Result := GetMemory(InstanceSize);
1018+
System.Move(vDynamicValueArrayInstanceTemplate^, Pointer(Result)^, InstanceSize);
1019+
end;
1020+
end;
1021+
1022+
// PrepareInstanceTemplate
1023+
//
1024+
class procedure TScriptDynamicValueArray.PrepareInstanceTemplate;
1025+
var
1026+
a : TScriptDynamicValueArray;
1027+
begin
1028+
a := TScriptDynamicValueArray.Create(nil);
1029+
a.Free;
1030+
end;
1031+
1032+
// ReleaseInstanceTemplate
1033+
//
1034+
class procedure TScriptDynamicValueArray.ReleaseInstanceTemplate;
1035+
var
1036+
p : Pointer;
1037+
begin
1038+
p := vDynamicValueArrayInstanceTemplate;
1039+
vDynamicValueArrayInstanceTemplate := nil;
1040+
FreeMem(p);
1041+
end;
1042+
9781043
// Swap
9791044
//
9801045
procedure TScriptDynamicValueArray.Swap(i1, i2 : NativeInt);
@@ -2606,6 +2671,14 @@ class function TScriptDynamicNativeBaseInterfaceArray.InterfaceToDataOffset : In
26062671
Result := NativeInt(@instance.FData) - NativeInt(intf);
26072672
end;
26082673

2674+
// FreeInstance
2675+
//
2676+
procedure TScriptDynamicNativeBaseInterfaceArray.FreeInstance;
2677+
begin
2678+
FData := nil;
2679+
FreeMemory(Self);
2680+
end;
2681+
26092682
// ------------------
26102683
// ------------------ TScriptDynamicNativeInterfaceArray ------------------
26112684
// ------------------
@@ -2634,6 +2707,43 @@ procedure TScriptDynamicNativeInterfaceArray.AddFromExpr(exec : TdwsExecution; v
26342707
// ------------------ TScriptDynamicNativeObjectArray ------------------
26352708
// ------------------
26362709

2710+
// NewInstance
2711+
//
2712+
var
2713+
vDynamicNativeObjectArrayInstanceTemplate : Pointer;
2714+
class function TScriptDynamicNativeObjectArray.NewInstance: TObject;
2715+
begin
2716+
if vDynamicNativeObjectArrayInstanceTemplate = nil then begin
2717+
Result := inherited NewInstance;
2718+
vDynamicNativeObjectArrayInstanceTemplate := GetMemory(InstanceSize);
2719+
System.Move(Pointer(Result)^, vDynamicNativeObjectArrayInstanceTemplate^, InstanceSize);
2720+
end else begin
2721+
Result := GetMemory(InstanceSize);
2722+
System.Move(vDynamicNativeObjectArrayInstanceTemplate^, Pointer(Result)^, InstanceSize);
2723+
end;
2724+
end;
2725+
2726+
// PrepareInstanceTemplate
2727+
//
2728+
class procedure TScriptDynamicNativeObjectArray.PrepareInstanceTemplate;
2729+
var
2730+
a : TScriptDynamicNativeObjectArray;
2731+
begin
2732+
a := TScriptDynamicNativeObjectArray.Create(nil);
2733+
a.Free;
2734+
end;
2735+
2736+
// ReleaseInstanceTemplate
2737+
//
2738+
class procedure TScriptDynamicNativeObjectArray.ReleaseInstanceTemplate;
2739+
var
2740+
p : Pointer;
2741+
begin
2742+
p := vDynamicNativeObjectArrayInstanceTemplate;
2743+
vDynamicNativeObjectArrayInstanceTemplate := nil;
2744+
FreeMem(p);
2745+
end;
2746+
26372747
// SetFromExpr
26382748
//
26392749
function TScriptDynamicNativeObjectArray.SetFromExpr(index : NativeInt; exec : TdwsExecution; valueExpr : TExprBase) : Boolean;
@@ -3112,4 +3222,20 @@ procedure TScriptDynamicNativeBooleanArray.WriteToJSON(writer : TdwsJSONWriter);
31123222
writer.EndArray;
31133223
end;
31143224

3225+
// ------------------------------------------------------------------
3226+
// ------------------------------------------------------------------
3227+
// ------------------------------------------------------------------
3228+
initialization
3229+
// ------------------------------------------------------------------
3230+
// ------------------------------------------------------------------
3231+
// ------------------------------------------------------------------
3232+
3233+
TScriptDynamicValueArray.PrepareInstanceTemplate;
3234+
TScriptDynamicNativeObjectArray.PrepareInstanceTemplate;
3235+
3236+
finalization
3237+
3238+
TScriptDynamicValueArray.ReleaseInstanceTemplate;
3239+
TScriptDynamicNativeObjectArray.ReleaseInstanceTemplate;
3240+
31153241
end.

Source/dwsExprs.pas

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1717,11 +1717,8 @@ implementation
17171717
// TScriptDynamicArray_InitData
17181718
//
17191719
procedure TScriptDynamicArray_InitData(elemTyp : TTypeSymbol; const resultDC : IDataContext; offset : NativeInt);
1720-
var
1721-
a : IScriptDynarray;
17221720
begin
1723-
CreateNewDynamicArray(elemTyp, a);
1724-
resultDC.AsInterface[offset] := a;
1721+
resultDC.AsInterface[offset] := CreateNewDynamicArray(elemTyp) as IScriptDynarray;
17251722
end;
17261723

17271724
{ TScriptObjectWrapper }

Source/dwsUtils.pas

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -912,7 +912,7 @@ TFastCompareTextList = class (TStringList)
912912
{$endif}
913913
end;
914914

915-
TClassCloneConstructor<T: TRefCountedObject> = record
915+
TClassCloneConstructor<T: class> = record
916916
private
917917
FTemplate : T;
918918
FSize : Integer;
@@ -6960,16 +6960,16 @@ procedure TSimpleIntegerStack.SetPeek(const item : Integer);
69606960
//
69616961
procedure TClassCloneConstructor<T>.Initialize(aTemplate : T);
69626962
begin
6963-
FTemplate:=aTemplate;
6964-
FSize:= FTemplate.InstanceSize;
6963+
FTemplate := aTemplate;
6964+
FSize := FTemplate.InstanceSize;
69656965
end;
69666966

69676967
// Finalize
69686968
//
69696969
procedure TClassCloneConstructor<T>.Finalize;
69706970
begin
69716971
FTemplate.Free;
6972-
TObject(FTemplate):=nil; // D2010 bug workaround
6972+
TObject(FTemplate) := nil; // D2010 bug workaround
69736973
end;
69746974

69756975
// Create

0 commit comments

Comments
 (0)