Entwickler-Ecke
Basistechnologien - String "2*pow(2,[level]-1)*2500" ausführen
silver-dragon - So 13.02.11 17:50
Titel: String "2*pow(2,[level]-1)*2500" ausführen
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.
silver-dragon - 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 - So 13.02.11 20:44
silver-dragon hat folgendes geschrieben : |
| 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...
silver-dragon hat folgendes geschrieben : |
| 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 - 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 - Mo 14.02.11 02:25
silver-dragon hat folgendes geschrieben : |
| 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 - 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?
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!