[fpc-devel] (patch) improvement of object creation speed

Sergei Gorelkin sergei_gorelkin at mail.ru
Tue May 20 14:31:27 CEST 2008


While valgrinding my projects, I noticed that InitInterfacePointers 
procedure eats noticeable amount of CPU cycles. For TObject.NewInstance 
call tree, I got Irefs for GetMem and InitInterfacePointers relating 
approx. as 42/36, i.e. InitInterafacePointers only a bit faster than GetMem.
What's worse, in projects that do not use interfaces (like the compiler 
itself), InitInterfacePointers is nothing but a waste of time.

I addressed this in two ways:

1) Declaring VMT as a record and rewriting related objpas.inc code in 
plain Pascal style (without typecasts) cuts down Irefs of 
InitInterfacePointers twice (36 becomes 17). The similar effect is 
probably achieved on other TObject methods - but I did not benchmark 
that explicitly.
It also makes the code *much* more readable.

2) Modified the compiler to write a special value (FPC_EMPTYINTF) to 
vmtIntfTable field of the VMT when neither the class nor any of its 
ancestors implement interfaces. FPC_EMPTYINTF points to an interface 
table with zero entries. This way, it's possible to break out of the 
interface lookup as soon as it's known that nothing can be found (and it 
can omit InitInterfacePointers altogether in relevant cases).

There are also some minor changes, like {$IMPLICITEXCEPIONS OFF} around 
TObject.Create (nothing can cause an exception in an empty method), 
inlining call to TObject.ClassName in TObject.ClassNameIs (eliminates 
local variable and string copy).

Best regards,
-------------- next part --------------
A non-text attachment was scrubbed...
Name: patch.zip
Type: application/x-zip-compressed
Size: 4046 bytes
Desc: not available
URL: <http://lists.freepascal.org/pipermail/fpc-devel/attachments/20080520/015519dd/attachment.bin>

More information about the fpc-devel mailing list