The main issue is that XE4 RTL implements weak references with a global lock, which will slow down the whole process a lot, especially in multi-thread.
procedure TInstHashMap.RegisterWeakRef(Address: Pointer; Instance: Pointer);
var
H: Integer;
Item: PInstItem;
begin
Lock;
try
H := Hash(Instance);
Item := FindInstItem(Instance, H);
if Item = nil then
Item := AddInstItem(Instance, H);
Item.RegisterWeakRef(Address);
finally
Unlock;
end;
end;
The Lock/Unlock
methods are implemented via
TMonitor
.
This synchronization class has the benefit to be cross-platform, but the
drawback of being slower
than other approaches.
Such a global lock will just kill the performance in multi-thread process.
Our weak pointer implementation for interfaces in mORMot uses a diverse approach, with a list per class type and small critical sections, so will be much more multi-thread friendly than XE4's implementation.
We can use ARC when targeting mobile platforms.
But in its current implementation, ARC would be a disaster about performance
for a server application.
I'm waiting for XE5!
Please do not kill Delphi desktop/server application performance!
In October last year
we were already speaking about this global lock implementation issue, when
we discovered a pre-version of it in the XE3 RTL source code.
And the version shipped with XE4 did not improve anything.
How could EMB say that performance is a concern for them?
The more I see it, the more I think that enforcing strings to be immutable for
performance reasons is just a joke, when you look at the current RTL state.