Ja, was soll ich sagen: JavaScript bleibt nun mal JavaScript - und darauf muß das Framework leider aufbauen (Lizenzbestimmungen von Google).
Ich habe Deine Aussagen untersucht und mußte feststellen, daß die Zuweisung von Ereignishandlern tatsächliche überproportional viel Zeit kostet. Ein kleiner Patch in der
Unit JScriptObjects sollte etwas Entspannung bringen:
Delphi-Quellcode:
procedure TCustomScript.MakeFunctionNameUnique(
var FunctionName:
String);
var
s:
String;
GUID: TGUID;
begin
if Assigned(FExternalMethods)
then
begin
if FExternalMethods.IndexOf(FunctionName)>=0
then
begin
CreateGuid(
GUID);
s:=GUIDToString(
GUID);
s:=StringReplace(s,'
{','
',[rfReplaceAll]);
s:=StringReplace(s,'
}','
',[rfReplaceAll]);
s:=StringReplace(s,'
-','
',[rfReplaceAll]);
FunctionName:=FunctionName+s;
if AnsiChar(FunctionName[1])
in ['
0'..'
9']
then FunctionName:='
_'+FunctionName;
end;
end;
end;
Das Ganze ist zwar kein Wundermittel - brachte aber auf meinem Rechner reichlich 50% Zeitersparnis bei 1000 Markern.
Um für die Marker nicht die ganze Oberfläche zu blockieren, könntest Du deren Erstellung auch in das
OnIdle-Ereignis der Anwendung auslagern oder zwischendurch
Application.ProcessMessages aufrufen. Die Auslagerung in einen Thread geht leider
nicht, da Microsoft's JavaScript-Engine nicht threadsicher ist.
Es wäre schön, wenn Du den Patch testen und mir mitteilen könntest, wie viel er gebracht hat. Wenn ich wieder etwas mehr Zeit habe, werde ich das Ganze noch einmal intensiver untersuchen und finde vielleicht noch die eine oder andere Optimierungsmöglichkeit.