Autor Beitrag
silver-dragon
Hält's aus hier
Beiträge: 3



BeitragVerfasst: So 13.02.11 17:50 
Hallo Forum :)

ich bastel gerade an einem Projekt bei dem ich einen String wieden Folgenden aus einer Datenbank Auslese:

"2*pow(2,[level]-1)*2500" oder "8.49*[level]*pow(1.1,[level]-1)" oder
"((round(25*pow(1.46114523,([level]-1)),0)+round(10*pow(1.46114523,([level]-1)),0))/(1250*(1+[roboterfabrik])))*pow(0.5,[nanitenfabrik])*pow(60,3-1)"

(Ist für eine Art kurzversion von einem Spiel)

Diese Datenbankeinträge werden idR. mit PHP verwendet. Nun muss ich diese auch mit C# verarbeiten können.
was ist die effektivste Möglichkeit diese Strings in C# auszuführen?

Ich würde jetzt anfangen die Funktionen pow durch "Math.pow" und round durch "Math.Round" zu ersetzten.
Platzthalter wie [level] duch die entsprechenden Integer ersetzten...

Aber wie kann ich den String dann ausführen?
Ich bitte um Hilfe.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4807
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 13.02.11 18:25 
Hallo silver-dragon,

du könntest dafür z.B. meine Komponente Parser für mathematische Formeln benutzen.

P.S. Das Ersetzen von z.B. "pow" durch "Math.Pow" bräuchtest du dann nur machen, wenn du direkt deinen String als C#-Code mittels "CodeDom" ausführen lassen wolltest (anstatt ihn wie bei meiner Komponente parsen zu lassen).
Der Formeleditor nutzt beispielsweise diese Technik.

Für diesen Beitrag haben gedankt: silver-dragon
silver-dragon Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: So 13.02.11 20:16 
hmmm, sieht gut aus, aber gibt es eine einfachere Möglichkeit?

Das Problem ist, dass die Formeln nicht komplexer werden als in den Beispielen, dafür aber sehr oft ausgeführt werden müssen.
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: So 13.02.11 20:44 
user profile iconsilver-dragon hat folgendes geschrieben Zum zitierten Posting springen:
hmmm, sieht gut aus, aber gibt es eine einfachere Möglichkeit?
Was gibt es denn einfacheres, als Code aus dem Internet zu kopieren und nur noch eine Methode aufrufen zu müssen ;) ? Wenn man so etwas schon einmal gemacht hat, kann man einen rekursiv-absteigenden Parser in einer halben Stunde auch schnell aus dem Ärmel schütteln, aber ansonsten...

user profile iconsilver-dragon hat folgendes geschrieben Zum zitierten Posting springen:
Das Problem ist, dass die Formeln nicht komplexer werden als in den Beispielen, dafür aber sehr oft ausgeführt werden müssen.
Gerade dann bietet sich so ein fertiger kompilierender Parser doch perfekt an :nixweiss: .

_________________
>λ=
silver-dragon Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mo 14.02.11 00:09 
Mit "einfacher" meinte ich die Ausführungsgeschwindigkeit pro Parsedurchgang :)

Ich hab mich deswegen zu folgender Variante entschieden, da im grunde nur etwa 30 verschiedene Formeln eingesetzte werden:

Eine einfache Methode in der in einer Switch-Schleife vordefinierte Formeln ausgeführt werden

z.B,
[highlight]case "2.83*[level]*pow(1.1,[level]-1))":
return 2.83 * Parameter_0 * Math.Pow(1.1, Parameter_0 - 1);[/highlight]

Wenn es keinen Treffer gibt kommt der Parser zum Einsatz.
In meinem Fall war das ca. 10x schneller

Danke für eure Hilfe ;)
:)
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mo 14.02.11 02:25 
user profile iconsilver-dragon hat folgendes geschrieben Zum zitierten Posting springen:
Mit "einfacher" meinte ich die Ausführungsgeschwindigkeit pro Parsedurchgang :)
Uh, das solltest du nächstes Mal lieber dazuschreiben. Aber statt dem switch sollte es doch auch genügen, die geparsten Ausdrücke zu cachen - ich gehe einfach mal davon aus, dass das wiederholte, nicht das einmalige Parsen dein Performanceproblem ausgelöst hat.

_________________
>λ=
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4807
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 14.02.11 14:02 
Hallo silver-dragon,

mein Parser unterstützt auch "vorkompilierte" Ausdrücke (mittels der Evaluate()-Methode).

Und schneller als in PHP sollte das allemal sein...

Nur warum werden die Ausdrücke dann in eine Datenbank geschrieben, wenn du sie doch wieder hartcodierst?