Einzelnen Beitrag anzeigen

Benutzerbild von littleDave
littleDave

Registriert seit: 27. Apr 2006
Ort: München
556 Beiträge
 
Delphi 7 Professional
 
#60

Re: Sysygy Script Engine - Version 0.99h

  Alt 25. Mär 2009, 15:42
Zitat von EugenB:
Huhu

gibt es schon irgendwelche Updates, nutzbare Versionen o.ä?

MfG
Eugen
Hallo EugenB

Also benutzbare Versionen gibt es noch nicht. Aber ich komme gut vorran. Ich kann ja mal schnell nen Status-Update machen:

Also der Compiler ist schon sehr weit fortgeschritten. Ich habe schon einen Unit-Cache eingebaut, was die Compile-Performance schon mal extrem verbessert: wenn man ein Script kompiliert, werden alle benutzen Units erstmal kompiliert. Sind diese erfolgreich kompiliert, werden diese Daten in einen Binärstream (im Moment im Speicher) gespeichert. Wird das Script jetzt nochmal neu kompiliert, werden die verwendeten Units nicht nochmal kompiliert sondern direkt aus dem Cache geladen. Dadurch schaff ich es, relativ "einfache" Scripts in ca. 20 ms zu kompilieren. Das ist natürlich sehr Vorteilhaft für die Code-Completion. Diese habe ich jetzt auch noch erweitert, so dass es jetzt eine Code-Completion und eine Param-Completion gibt (in Delphi Strg+Shift+Leertaste). Das funkioniert bisher ganz prima.

Ein weiterer wichtiger Punkt ist die Run-Performance. Diese hab ich schon mal extrem verbessert. Hier mal eine kleine Tabelle (die einzelnen Test stehen unter der Tabelle), bei der ich die alte Script-Engine mit Pascal Script und mit meiner aktuellen vergleiche (alle Angaben in Sekunden)
Code:
-          Sysygy Script Engine  Pascal Script         ScriptEngine2
Test 1     4,76                   0,8                    0,9
Test 2     7,40                   1,6                    1,89
Test 3     12,75                  2,3                    2,8
Test 4     14,22                  8,44                   4,3
Test 5     26,10                  16,81                  8,7
Test 6     38,17                  25,21                  13,3
Test 7     31,39                  26,27                  11,0
Test 8     66,00                  52,61                  22,0
Test 9     99,10                  79,08                  33,0
-----------------------------------------------------------------------
Gesamt    299,89                 213,12                 97,89
Die einzelnen Test sind die Ausführungsgeschwindigkeiten von unterschiedlichen Scripten.
Test 1
Delphi-Quellcode:
program Test;

var i: integer;
begin
  for i:=0 to 1000000 do ;
end.
Test 2
Wie Test 1, nur zählen bis 2000000

Test 3
Wie Test 1, nur zählen bis 3000000

Test 4
Delphi-Quellcode:
program Test;

var i: integer;
begin
  for i:=0 to 1000000 do
  begin
    if i mod 2 = 0 then begin end;
    if i mod 3 = 0 then begin end;
    if i mod 4 = 0 then begin end;
  end;
end.
Test 5
Wie Test 4, nur zählen bis 2000000

Test 6
Wie Test 4, nur zählen bis 3000000

Test 7
Delphi-Quellcode:
program Test;

var i: integer;
begin
  for i:=0 to 1000000 do
  begin
    if i mod 2 = 0 then begin end;
    if i mod 3 = 0 then begin end;
    if i mod 4 = 0 then begin end;
    if i mod 5 = 0 then begin end;
    if i mod 6 = 0 then begin end;
    if i mod 7 = 0 then begin end;
    if i mod 8 = 0 then begin end;
    if i mod 9 = 0 then begin end;
    if i mod 10 = 0 then begin end;
  end;
end.
Test 8
Wie Test 7, nur zählen bis 2000000

Test 9
Wie Test 7, nur zählen bis 3000000

Wie man Anhand den Zeiten sieht, habe ich die Script-Engine gerade für komplexe Aktionen optimiert. Bei einer einfachen for-Schleife ist Pascal-Script noch ein wenig besser als meine Script-Engine. Sobald ich dann aber was in der for-Schleife mache, ist meine Script-Engine bei weitem schneller als Pascal-Script (und sowieso schneller als meine alte Script-Engine).

Dies erreiche ich vorallem durch einen eingebauten Memory-Manager in die Script-Engine. Dieser Memory-Manager ist dabei nicht ein Carbage Collector für die Script-Variablen - meine Script-Engine wird erstmal keinen Managed-Code benutzen. Ein weiterer Performance-Schub ist der eingebaute Linker, der den erstellen Byte-Code noch optimiert.

Mit dem Standard-Unit-Import komme ich auch schon ganz gut vorran. Bisher habe ich schonmal fast alle Funktionen der Unit Math eingebaut. Auch fast alle String-Operationen sind bereits eingebaut. Ach ja, DateTime wird auch kopmlett unterstützt (inklusive der Unit DateUtils). Da die Script-Engine ermöglicht, Units über mehrere Dateien zu spannen, muss man die einzelnen Units nicht mühsam einbinden.

Hier mal ein kleines Demonstations-Script:
Delphi-Quellcode:
program Test;

var i: integer;
    d: TDateTime;
begin
  // Aktuelles Datum ausgeben
  d := DateTime.Now;
  Console.WriteLine(DateTime.DateTimeToStr(d));
  
  // Ne Schleife
  for i:=0 to 5 do
    // Overload-Test
    Console.Write(i);
                      
  // Noch ein Overload-Test
  Console.WriteLine();
  // Eine Funktion aus Math
  Console.WriteLine(Math.Max(5.0, 10.0));
  // Eine Convert-Routine
  Console.WriteLine(Convert.BoolToStr(False, True));
  
  // Oder einfach nur nen String
  Console.WriteLine('Ende');
  
  Console.ReadKey;
end.
Das Ergebnis:
Code:
25.10.2009 16:33:24
012345
10
False
Ende
Also es geht wirklich gut vorran. Was ich jedoch noch nicht gemacht habe ist: records, array, OOP, ... Es wird also noch ne ganze weile dauern, jedoch wenns so gut weitergeht, nicht mehr all zu lange .

So, das war jetzt erstmal nen kleiner Status-Update. Sobald es wieder was wichtiges gibt, werd ich mich wieder melden.

Grüße
Dave
Jabber: littleDave@jabber.org
in case of 1 is 0 do external raise while in public class of object array else repeat until 1 is 0
  Mit Zitat antworten Zitat