Schnellster Weg, einen Wert auf bestimmte Bereiche zu prüfen
-
Hey!
Wie prüft man einen Wert am schnellsten auf bestimmte Bereiche?
Beispiel:int i;
i darf 1 - 9 sein
i darf 14, 15 sein
i darf 26 - 39 sein
i darf 50, 51, 52, 53 seinWie am besten prüfen? Es muss schnell gehen, denn es ist ein bisschen zeitkritisch.
Soll ich inline ASM verwenden? Kann aber kein ASM, über Code wär ich froh.
Viele if-Abfragen und Vergleiche möchte ich halt sparen, könnten auch noch paar mehr Bereiche werden.THX!
-
Gibt es denn auch "i darf 50,52,55 sein"? Ansonsten sind ja alle Beispiele von-bis-Vergleiche.
-
Das war natürlich blöd erklärt von mir...
Ja, es kann sein dass dazwischen Zahlen geprüft werden müssen, also nicht ausschließlich nur Bereiche...int i;
i darf 1 - 9 sein
i darf 12, 19, 22 sein
i darf 26 - 39 sein
..Sry und thx
-
Wenn dein Zahlenbereich relativ klein ist, kannst du ein bool-Array verwenden.
Bei deinem Beispiel lohnt sich das evtl. aber noch gar nicht (im Vergleich zu ein paar geschachtelten if-Abfragen). Einfach testweise die Zeit messen.
-
Wäre nicht vielleicht eine switch- Anweisung optimal?
switch(i) { case 1: case 2: case 3: case 4: case 9: case 12: case 21: case 27: case 28: case 29: case 30: case 31: case 32: break; default: // Ungültiger Wert }Sind zwar viele cases, aber ist das nicht schnell?
Thx
-
Eilender schrieb:
Wie am besten prüfen? Es muss schnell gehen, denn es ist ein bisschen zeitkritisch.
Woher weißt du dass es genau die Stelle im Programm ist die so zeitkritisch ist? Hat dir dein profiler gesagt dass an der Stelle so viel zeit verloren geht? Oder ist das nur eine Vermutung?
Falls du noch nicht vom Profiler bestätigt bekommen hast dass dort der kritische Punkt ist, würde ich es so machen:
- "Ganz normal" implementieren, also wie üblich so, dass es gut lesbar und wartbar ist.
- Schauen ob du wirklich Performanceprobleme im Programm hast
- Falls ja, mit dem Profiler schauen, WO die Probleme wirklich liegen
- erst danach die entsprechenden Stellen verbessern
Das Vorgehen sollte man immer in der Reihenfolge machen, denn meist bringt es herzlich wenig, zu schätzen wo es Probleme gibt und da von vornherein versuchen den Code zu verschlimmbessern, Das heißt natürlich nicht dass man von vornherein erstmal schlechten Code schreibt oder sich keine Gedanken über Algorithmen machen sollte.
Ich würds in etwa so regeln:template <typename T> bool inInterval(T val, T min, T max) { return (val >= min) && (val <= max); } /*...*/ if ( inInterval(x,1,9) or (x == 12) or (x == 19) or (x == 21) or inInterval(x,26,39) ) { /*.....*/ }
-
std::map<int,bool> und rein mit den erlaubten Zahlen. Sollte schnell abzufragen zu sein.
-
Fellhuhn schrieb:
std::map<int,bool> und rein mit den erlaubten Zahlen. Sollte schnell abzufragen zu sein.
nicht lieber std::set<int>?
-
newbfeind schrieb:
Fellhuhn schrieb:
std::map<int,bool> und rein mit den erlaubten Zahlen. Sollte schnell abzufragen zu sein.
nicht lieber std::set<int>?
Dann eher std::unordered_set. Und wie bereits gesagt wurde ein std::vector<bool> wenn es sich um eine begrenzte Zahlenmenge handelt.
-
Eine unbegrenzte Zahlenmenge wäre auch ein bissel schlecht.

-
Es geht um einen serverseitigen AntiCheat, da ist jeder Buchstabe zeitkritisch

Also muss ich wirklich alles optimieren.Danke für die Antworten.
MfG
-
Eilender schrieb:
Es geht um einen serverseitigen AntiCheat, da ist jeder Buchstabe zeitkritisch

Also muss ich wirklich alles optimieren.Danke für die Antworten.
MfGlol...
ein buchstabe ist zeitkritisch? Oo ok - wie du meinst ^^
weiste überhaupt, was ein profiler ist?
-
Nanyuki schrieb:
Wenn dein Zahlenbereich relativ klein ist, kannst du ein bool-Array verwenden.
Das finde ich auch eine gute Idee
