![]() |
Re: Mathem. Parser -- bitte testen
@dizzy
Delphi-Quellcode:
Ich denke mal, dass das ziemlich am realen Ergebenis vorbeisaust, wenn der AMD eine angeblich 32-mal höhere Frequenz hat, oder AMD hat es endlich geschafft Intel einzuholen :lol: .
function Ticks(Cycles: Int64): Double;
// rechnet Taktzyklen in Millisekunden um begin Result := Cycles * 1000 / CPUFrequency; end; p.s.: der P4 war nach meiner subjektiven Empfindung ca. doppelt so schnell. ;) Nachtrag: Zitat:
|
Re: Mathem. Parser -- bitte testen
Zitat:
![]() (Und sorry Hagen, du hattest 'nur' den Zusatz geposted. Die Routine ist ja von... ja von Luckie) |
Re: Mathem. Parser -- bitte testen
Hi!
Zitat:
Zitat:
|
Re: Mathem. Parser -- bitte testen
Zitat:
die andere Unit QMAth2.pas habe ich doch glatt übersehen, dann ist das ganze mit den Kommentaren nicht so tragisch, aber wenn du es doch noch machst, dann bedanke ich mich an dieser Stelle mal ;-) Achso wenn du noch Kommentare machst, dann ist mir das vollkommen gleich, ob Englisch oder Deutsch ;-) PS: Vielleicht sollte ihc mich doch mal mit Assembler beschäftigen :pale: :mrgreen: |
Re: Mathem. Parser -- bitte testen
Moin!
So, ich habe das Ding auch mal getestet. Ich benutze Delphi 5 Prof (Update Pack 1) (mit den vorher gehenden Änderungen im Code) auf einem P4 mit HT auf 3.0 GHz. Beim aller ersten Lauf braucht er bei der Delphi Rechnung recht lange, bei einem sofortigen 2. Start (ohne das Prog zu beenden) geht's bedeutend schneller. Die Zeiten (2. Durchlauf, 1. Durchlauf hatte auch nix "positiveres"...): -189173 -370250 -912305 -1,83168E6 Nochwas allgemeines: im Kommentar im Header sind ein paar Rechtschreibfehler (address mit Doppel-d, I z.T. klein geschrieben, etc). MfG Muetze1 |
Re: Mathem. Parser -- bitte testen
Zitat:
Zitat:
Zitat:
Danke dir! Und an der Performancemessung muss ich wohl noch mal was machen... dann wird's weniger akkurat, aber sollte zumindest überall klappen. Schade das. MfG, dizzy |
Re: Mathem. Parser -- bitte testen
Hi dizzy,
interessieren dich die Ergebnisse immer noch? ;)
Chris |
Re: Mathem. Parser -- bitte testen
Ja na klar! Ich schraube noch immer an dem Teil rum. Mittlerweile kann er sogar konstante Teile einer Formel vorausberechnen, so dass das Lösen dann noch fixer geht :) (je nach Verwendung der Variablen natürlich)
Was ich noch interessant fände, wäre noch die Sache mit der "Optimalität" des QT. Keine Leaks? (Hab bisher keine gefunden.) Ist er schön? ;) Sind die verwendeten Techniken auch wirklich die performatesten/komfortabelsten? Braucht das überhaupt wer :?: :mrgreen: Danke dir Chak! |
Re: Mathem. Parser -- bitte testen
So, ich habs auch mal getestet:
|
Re: Mathem. Parser -- bitte testen
Liste der Anhänge anzeigen (Anzahl: 1)
Moin, moin,
im Anhnag findet sich die Version für D4, sollte auch mit D3 laufen. Die Zeiten auf dem alten Rechner spare ich mir aber. Grüße // Martin |
Re: Mathem. Parser -- bitte testen
Hi,
- Delphi7 Professional (kompiliert ohne Probleme) - Ergebnisse sind korrekt - Amd Athlon 2800+, gibt so um die 2 Ghz Realtakt Ergebnisse (von oben nach unten): 850,968 1478,88 3733,95 6893,12 Gruß, Kastor |
Re: Mathem. Parser -- bitte testen
Kritik: Der Parser ist sehr ausprogrammiert und schlecht erweiterbar. Schau die mal ein paar Seiten zum Thema Compilerbau, Deterministisch Endlicher Automat, Optimierung, ZwischenCode usw. an. Denn in dem Copy&Paste-Code möchte ich nie etwas ändern. |
Re: Mathem. Parser -- bitte testen
Zitat:
Ihn voll "customizable" zu machen, das wollte ich nicht, da dass erheblich an der Performance gedrückt hätte, und ich wollte das Teil so schnell wie auch nur irgend möglich machen. Das war im Gegensatz zur Erweiterbarkeit oberstes Ziel, daher auch meine Testreihe hier. Habe das Ding jetzt sogar in eine DLL verpackt, so dass das mit der Erweiterbarkeit ohnehin flach fällt, man ihn aber in beliebigen Sprachen einsetzen kann (die DLLs einbinden können...). Ein paar kleine Finetunings sind noch nötig, und dann werd ich den nochmal komplett mit Source+DLL hier einstellen. Und es sollte garnicht nötig sein ihn zu erweitern, da ich eigentlich so ziemlich alle Grundoperationen drin hab, incl. der eigentlich nie gebrauchten trigonometrischen Funktionen für Quaternionen :roll: :) Speed war deshalb oberstes Gebot, da ich mit dem Teil 3D-Fraktale berechne, und da kommen sehr leicht > 10.000.000 Rechendurchläufe pro Formel rum. Wenn diverse Funktionen fehlen sollten, die ihr vermissen würdet, so bin ich offen für Vorschläge! Das Dingen sollte nachher als Monolit dastehen, d.h. fertig und rund. Zwar OpenSource, aber nicht mit der Notwendigkeit dran rumzufummeln :). Wobei das wie gesagt garnicht so unmöglich ist :cyclops:. Danke aber für den Tipp, ich hatte diesen Aspekt noch nicht als einzelnes betrachtet. grüzli, dizzy |
Re: Mathem. Parser -- bitte testen
Genau so könnte man aber Speed rausholen.
Grund: Wenn du die Formel zu einer schnell durchrechenbaren Sprache umcompilierst und opimierst, vermute ich, dass das Teil schneller wird. Bei Meinem Formel-Parser (der langsamer ist, durch Typenkonvertierungen und OOP) gehe ich wie folgt vor. (1 + sin(A))^3 * (1+1) Erster Schritt: zerlegen in Token (Teile): "1" "+" "sin" "(" "A" ")" "^" "3" "*" "(" "1" "+" "1" ")" Dies erledigt eine while Schleife gekoppelt mit einer Matrix. Baue aus den Tokens einen Parsebaum: Dazu wird ein vor definierter Syntax-Graph durchlaufen. -> Wieder nur eine while-Schleife Optimiere den Code: in dem Fall wird 1+1 zusammengefasst. Erzeuge Code:
Code:
Und die Ausführung dieses Code's könnte man extrem Optimieren.
push 1
push a sin and push 3 power push 2 mul Array für Stack. Sprung-Tabelle für Proceduren. |
Re: Mathem. Parser -- bitte testen
@neolithos:
deinen Ansatz mit den bäumen verfolge ich auch gerne, besonders in PHP. Was ich persönlich nicht verstanden habe ist dein erzeugter code mit "pushes", deren verwendung mir nicht klar ist (sieht nicht wie assembler aus). greets ripper (sorry für mein gelaber) |
Re: Mathem. Parser -- bitte testen
Das ist auch keine Assembler sonder eine eigene Sprache.
Sie basiert auf einem Stack. -> Stackmaschine. push 1 --> legt 1 auf den Stack push 4 --> legt 4 auf den Stack and --> nimmt zwei Werte vom Stack, Addiert sie und legt das Ergebnis auf den Stack. |
Re: Mathem. Parser -- bitte testen
Hi,
ich war noch etwas verwirrt, weil ich bei den Tokens keine Klammern um die 1 und das Sinus gesehen hab. So ein Stacksytem ist echt nicht schlecht! An solche Bäume lassen sich auch symbolische Umformungen ansetzen: ein Computer Algebra System!! - ripper (sorry für meine verwirrten posts) |
Re: Mathem. Parser -- bitte testen
Zitat:
Zitat:
Zitat:
Zitat:
(Diese Funktion ist in dem hier eingestellten glaub ich noch nicht vorhanden. Bei mir aber sehr wohl :)) Zitat:
Ich hatte mal testweise 2 verschiedene Stackprinzipe eingebaut: Ein mal mit nur einem Stack, und mal mit getrennten Operanden- Werte- und Ergebnisstack. Beide Versuche führten zu einer erheblichen Verlangsamung. (Man muss hierbei beachten, dass die Stärke meines Parsers ist, ein und die selbe, ein einziges Mal geparste Formel, immer und immer wieder zu lösen, mit veränderten Variablen. Also zum Plotten von Funktionen gut geeignet, oder halt für Fraktalrechnungen ;)) Bei der Variante mit einem Stack war das Problem, dass ich für jedes Mal Lösen den gesamten Stack "echt" kopieren musste. Und das hat einfach viel zu lange gedauert. Bei der Variante mit 3 Stacks fiel der Kopieraufwand weg, aber der Overhead durch die Stackverwaltung in Form von Unterscheidung von Unären und Binären Operatoren, und der Indexverwaltung an sich, war wohl größer als der Overhead einer Rekursion. Zumindest hatten das meine Messungen ergeben. Von daher bin ich beim Baum geblieben. Was auch noch mit reinspielt ist, dass ich gerne die 3 Zahlentypen strukturell möglichst gleich abhandeln wollte. Und die Rechnerei mit komplexen Zahlen/Quaternionen gestaltet sich ja noch etwas anders als mit double, da man ja nicht die normalen Operatoren verwenden kann. Weiteres Schmankerl ist in dieser Hinsicht auch das Variablenhandling. Es gibt 8 Variablen, denen es völlig egal ist ob sie nun ein double-Wert sind, ne komplexe Zahl, oder was auch immer. Daher bleibt die "usability" für den "Endbenutzer" (also Programmierer...) gut. Um mit dem Teil etwas mit double-Werten zu rechnen reicht folgendes:
Delphi-Quellcode:
Naja, und ich bin (noch *g*) der Meinung dass ich meine beiden obersten Ziele (Speeeed und einfache Bedienbarkeit) einigermaßen gut erreicht habe.
var p: TCQParser;
ergebnis: double; . . p := TCQParser.Create; p.Parse('(1 + sin(A))^3 * (1+1)'); p.SetVariable(A, pi); p.Solve(ergebnis); Wenn du es aber hinbekommen solltest das Dingen noch schneller zu machen, dann bin ich der erste dem die Kinnlade runterfällt *provozier* :mrgreen:. Ich werde die Tage (in 1-2 Wochen) die neue Version posten. Ich will ein Parser-Battle :twisted: guts Nächtle, dizzy |
Re: Mathem. Parser -- bitte testen
Erstens:
Die Klammern hatte ich vergessen! Zweitens: Meinen Parser habe ich mit C# geschrieben und dort verwende ich verdammt viel in/outboxing. Dies scheint zu lasten der Performance gehen. Drittens: Jetzt hast du mich doch neugirig gemacht! Ich will mal wissen wie schnell in einem Win32-Programm ist. Wenn ich mal Zeit habe schreib ich das Teil um. :mrgreen: Viertens: Meinem Parser werde ich aber nur Integer und Double beibringen. |
Re: Mathem. Parser -- bitte testen
Zitat:
Das entbehrt latürnich nahezu jeder Vergleichbarkeit. Zitat:
Leider bleibt mir natürlich die Optimierung durch .NET verwehrt :? Zitat:
|
Re: Mathem. Parser -- bitte testen
1195,79 1992,97 4718,33 8877,55 :hi: |
Re: Mathem. Parser -- bitte testen
Liste der Anhänge anzeigen (Anzahl: 2)
Ich habe heute für mal schnell eine Stackmaschine zum Testen geschrieben.
Das Ergebnis sieht wie folgt aus. Deine Parser brauch ca zwischen 3000 bis 3400 ms. Meine Stackmaschine brauch ca zwischen 2800 bis 3100 ms. Dieses Ergebnis kann man als gleichschnell bewerten. :gruebel: Übrigens: Musste ich alle Tricks in C Anwenden, um native Stack-Operationen zu vermeiden. Sonst würde meine Maschine ein wenig über deinen Werten liegen. Aber das waren auch nicht viele ms. (glaube zw. 3900 und 4200 ms). Als Anhang gibt es das Saumäßig in der Schnelle getippte C-Programm. |
Re: Mathem. Parser -- bitte testen
Zitat:
848,759 1421,61 3571,95 7007,47 Windows XP x64 (Debug) -7717,32 -13012,8 -31220 -61769,2 Gruss Nico |
Re: Mathem. Parser -- bitte testen
Liste der Anhänge anzeigen (Anzahl: 1)
So jetzt wie versprochen (in der PN) die Pascal'sche Variante.
Übrigens sind es zwei Versionen in einer Datei: Die erste Ausgeklammerte lag bei ca 4000 ms. Also schneller als die gleichwerdige C-Variante. Ein hoch auf den Borland-Compiler-Optimierer. Die jetztige Variante, die CALL's vermeidet, liegt auch im Limit. zw. 3000 und 3200 ms. Also ein Tick langsamer als die C-Makro-Variante. Sind aber auch mehr Call's trinne. |
Re: Mathem. Parser -- bitte testen
:shock:
Formel: (1 + sin(pi/2))^3 * 2 Durchläufe: 5.000.000 Messmethode: GetTickCount Mein Parser als DLL-Version: 1450ms Als eingebundene Unit: 1530ms :?: DAS wundert mich schon etwas... Deine Stackmaschine: 1312ms :cry: ...ich spiele mit Umbaugedanken... *gnarf* ;) \\edit: Ich hab nen kleinen Fehler gemacht! Mein Parser hat das pi/2 immer wieder neu ausgerechnet - scheinbar klappt die Vorausberechnung von Konstanten noch nicht so ganz :? Wenn ich mit einer Variablen=pi/2 rechne siehts so aus: DLL-Version: exakt gleich schnell wie die Stackmaschine: 1312ms Unit: nur 1455ms Ich muss aber ganz offensichtlich noch mal an meinen Optimierer ran! Eigentlich ist ja die ganze Formel konstant, und von daher sollte die gesamte Formel zu einem Baum mit nur einem Knoten=16 zusammenschrumpfen. Das tut er ganz offensichtlich nicht! Mist :) |
Re: Mathem. Parser -- bitte testen
Bei meinem Optimierer tut er das auch!
Da entsteht nur noch "push 16"! Ich könnte meine Kenntnisse eventuell mit einfließen lassen! Hinsichtlich Scanner -> Parser -> Compiler -> Virtuelle Maschine. Dann könntest du auch den wunsch von beliebigen Variablen erfüllen! |
Re: Mathem. Parser -- bitte testen
Zitat:
Grad noch gefummelt... war, wie eigentlich immer, nur ein ganz kleiner blöder Patzer. Zitat:
Das Ding hier hab ich mir über längere Zeit zusammen gebastelt, und ausgebaut, und hab das Thema dabei etwas mit-gelernt. Aber so richtig in die Tiefe kommt man ja doch nicht. Zitat:
Hatte mir da schon was mit arrays überlegt, in die der Benutzer selber Variablennamen eindefinieren könnte, in der Art:
Delphi-Quellcode:
Da ließe sich auf diesem Wege bestimmt was machen. Bin da aber (noch) für alles offen (ist ja noch keine Zeile zu geschrieben ;)).
DefineVar('var01', pi);
Die neue Version mit funktionierendem Pre-Solving schiebe ich in den anderen Thread mit der Final-Version. Vielen Dank für dein Interesse und Unterstüzung!! gruss, dizzy |
Re: Mathem. Parser -- bitte testen
Vielleicht hast du es gesehen!
Ich mache mir derzeit eine Rübe wie man die Formel direkt als IA-32 Befehl in den Ram ablegen könnte, und ausführen. Leider sind meine ersten Test's noch nicht ganz geglückt. Das wäre aber die schnellste Variante. Und wäre auch eine schöne Übung, welche mich näher an mein Ziel heran bringt. Einen eigenen Compilier! :spin: |
Re: Mathem. Parser -- bitte testen
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ich habe mal den Parser um die Funktion erweitert, beliebig viele Konstanten in der Formel zu benutzen... Einfache Zuweisung mittels SetVariable(String, const Value) Vielleicht brauchts ja jemand :) |
Re: Mathem. Parser -- bitte testen
Hi,
ich würde dich bitten diese langen SourceCodes als PAS-Datei anzuhängen. Danke, Chris |
Re: Mathem. Parser -- bitte testen
:shock: Das ist lieb von dir, aber der Parser hier ist schon etwas überholt :? Mittlerweile bin ich bei Version 1.2, und es hat sich einiges geändert... Unter anderem das Variablensystem, die Konstanten, Precalculation ist drin, etc.
Er ist allerdings noch nicht online, da ich immer noch ein zwei Kleinigkeiten dran schrauben wollte - aber z.Zt. (wie so oft bei halb-fetigen Codes) wieder bei was anderem bin ;). Gut gemeint, aber nicht mehr aktuell... :oops: hätte ich vllt. hier schreiben sollen dass das nicht mehr so wirklich aktueller Stand ist. Sorry! Aber schön zu hören, dass sich Leute (ein Leut :mrgreen:) für das Teil interessieren *froi*. Herzlichen Gruss, Fabian |
Re: Mathem. Parser -- bitte testen
Zitat:
@dizzy Wenn du noch dran arbeitest, kannst du ja alle Funktionen dynamisch einbinden, d.h. das Ganze so implementieren, dass noch zur Laufzeit Funktionen/ Operatoren eingebunden werden. Wäre jedenfalls so ne Idee die mir so spontan noch einfällt :) |
Re: Mathem. Parser -- bitte testen
Wer volle "Customizability" haben möchte, der sollte sich auch mal den Parser von Dax anschauen - das Teil bringt seine eigene Scriptsprache mit :).
Mir ging es beim CQParser um 2 Dinge: 1. Komplexe Zahlen + Quaternionen 2. Speed Speed und nochmal Speed :D Ich hatte ihn mal für ein eigenes Projekt entwickelt, in dem es um das volumetrische Rendern von 3D-Fraktalen ging, und dabei wird der Parser irrsinnig oft um eine Lösung gebeten... Naja, und wie so oft sthen sich hier Anpassbarkeit und Performance gegenüber. (In XML kann man jede Form von Daten strukturieren - aber alles basiert auf Strings -> mächtig aber langsamer. Binäre Formate sind fix verarbeitet, aber auf ein spezielles Problem zugeschnitten. Ich wandere da eher auf der binären Seite ;)) Wobei der CQParser sicherlich relativ einfach "fully scaleable" machbar ist. Alles zu seiner Zeit :drunken: Danke dir! Gruss, Fabian |
Re: Mathem. Parser -- bitte testen
Hallo,
ich habe zur Zeit in meinem Projekt den CqParser benutzt, allerdings um einige Funktionen erweitert. Vom Speed her gefällt er mir recht gut :) Ich muss nun allerdings den Parser um eine recht grosse Anzahl an Funktionen erweitern. U.a. um Funktionen mit mehreren Parametern (max 3 Parameter). Ich hatte mal irgendwann einen anderen Parser am Wickel, bei dem man Funktionen einfach beim Parser zur Laufzeit "registrieren" konnte. Dummweise habe ich den Namen vergessen :( und eine Suche bei Google/ DSP/... hat noch nicht viel ergeben. Habt ihr eine Empfehlung für einen Parser mit einfacher Integration neuer Funktionen und hoher Performance ist? Danke :) mr.s |
Re: Mathem. Parser -- bitte testen
dELPHI 2005 architect
problemlos 1112.48 1766.71 4282,06 7678,19 Amd Athlon 2GHZ Cool: Da sieht man endlich mal wieder wie wenig 2 GHZ doch sind :mrgreen: |
Re: Mathem. Parser -- bitte testen
Zitat:
Meinen um >2-parametrige Funktionen zu erweitern, das wäre doch sehr umfangreich - das seh ich ein :? edit: Wenn du allerdings die komplexen Zahlen bzw. Quaternionen brauchst, dann weiss ich nicht in wie weit Dax's Parser mit macht. U.U. lässt sich das selbst via Script implementieren - wie performant das dann ist weiss ich nicht. (;)) @mr47: Dangeschön! Gut zu hören dass er auch unter D2005 tut - aber wahrscheinlich mit 1001 "unsicherer Code"-Hinweisen, gell!? :D |
Re: Mathem. Parser -- bitte testen
Zitat:
In D2005 für Win32 werkelt auch nur ein veränderter D7 Compiler und in den Warnungen sind die .NET Warnungen standardmäßig abgeschaltet ;) mfG mirage228 |
Re: Mathem. Parser -- bitte testen
Wo finde ich denn den Parser von Dax?
Die Suche bei google nach TMathParser ergbibt recht viele Parser... Und im Forum hier finde ich dazu nichts. Die Frage ist dann aber wie schnell der Parser ist... Ich habe jetzt als Grundlage den " ![]() Die Variablenzuweisung musste ich ändern und komplexe Zahlen muss ich noch integrieren. Aber meine ersten Tests haben gezeigt dass der Parser sogar noch schneller als der CQParser ist, wenn viele Variablen in der Formel vorhanden sind. Bsp: 10+(x1^2-10*cos(2*pi*x1))+(x2^2-10*cos(2*pi*x2)) 5.000.000 Durchläufe CQ => 4,6s P10 => 2,7s AMD 2400+ mfg mr.s |
Re: Mathem. Parser -- bitte testen
Irgend ne Meldung kam am Anfang, die ich aber nicht weiter beachtet habe :mrgreen:
|
Re: Mathem. Parser -- bitte testen
Zitat:
Zitat:
Zitat:
Kann gut sein, dass die vielen Variablen den Pre-Solver gut ins Schwitzen bringen. Vielleicht hat der P10 sogar einen Formel-Optimierer (hat CQ nicht...). Das meiste Optimierungspotential beim CQ ist denke ich in der "QMath.pas", in dem man nämlich diverse Fuktionen via Assembler weiter optimiert (die einfachen hab ich schon - zu mehr reichte es nicht ;)), oder halt beim Presolven/Formeloptimieren. Das wäre aber auch einiges an Arbeit - aber interessant! @mirage228: Ja NOCH besser :D |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz