[fpc-devel] Faster InitObject

Sven Barth pascaldragon at googlemail.com
Thu Feb 23 10:16:07 CET 2012


Am 23.02.2012 10:05, schrieb Tommi Prami:
>  >
>>
>> > Incl. Self. Called Function
>> > 29.78 29.72 26M SYSTEM_FILLCHAR$formal$INT64$BYTE
>> > 19.07 19.07 123M SYSTEM_MOVE$formal$formal$INT64
>> > 3.63 3.63 70M SYSTEM_SYSGETMEM_FIXED$QWORD$$POINTER
>> > ....
>> >
>> > The main caller of FillChar function is
>> > system_TObject_$__NewInstance$$TObject which called Fillchar 26 Million
>> > times.
>> >
>> > NewInstance method in TObject calls InitInstance which is an inline
>> > function and defined as follows:
>> >
>> > class function TObject.InitInstance(instance : pointer) :
>> > tobject; {$ifdef SYSTEMINLINE} inline; {$ENDIF}
>> >
>> > begin
>> > { the size is saved at offset 0 }
>> > fillchar(instance^, InstanceSize, 0);
>> > { insert VMT pointer into the new created memory area }
>> > { (in class methods self contains the VMT!) }
>> > ppointer(instance)^:=pointer(self);
>> > if PVmt(self)^.vIntfTable <> @emptyintf then
>> > InitInterfacePointers(self,instance);
>> > InitInstance:=TObject(Instance);
>> > end;
>> >
>> > My question is do we need to call fillchar in InitInstance? Or Is there
>> > any way to avoid calling InitInstance?
>>
>> Yes, FillChar is needed, because a class instance is guaranteed to
>> have Bennett initialized with zero before the first constructor is
>> called (this way the fields are basically initialized by 0, Nil or ''
>> depending on the field type).
>>
>>
>
> But still...
>
> Any improvement done in the Creating and Freeing an Objects would be
> welcome :)
>
> We need the FillChar there, but if the object creation could be
> optimized even a little bit, it would benefit almost all the code. Some
> more than others... But still...

In August 2010 Florian already said that maybe FillChar should be 
optimized: 
http://lists.freepascal.org/lists/fpc-devel/2010-July/021146.html (at 
the bottom)

Regards,
Sven




More information about the fpc-devel mailing list