-
-
Notifications
You must be signed in to change notification settings - Fork 226
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
perfomance boost with ip2addr #1771
base: development03
Are you sure you want to change the base?
Conversation
Ja, die Diese Version ist präziser und nutzt die vorhandenen Funktionen der Standardbibliothek, was zu einer besseren Lesbarkeit und Wartbarkeit des Codes führt. |
Irgendwie erscheint mir der Code komplett falsch, es wird nun 4 mal derselbe String gelesen, die variable |
Achja: Hast du den "performance boost" mal gemessen? |
Der Code könnte so aussehen, jedoch besteht das Problem, dass man davon ausgehen muss, dass auch falsche Eingaben möglich sind. Der Code wird nur einmalig beim Start oder beim Aufbau eines Interfaces ausgeführt. Das ist für diesen Anwendungsfall tolerierbar. In einer idealen Welt, in der jede Eingabe fehlerfrei ist, gebe ich dir Recht, dass atoi die bessere Wahl wäre. Da dies jedoch nicht immer der Fall ist, sollten wir auf Fehler achten. Ich sehe, dass du sehr engagiert in diesem Thema bist, genauso wie bei OpenHAB und Tvheadend(damals selbst genutzt). Es wäre großartig für mich und die gesamte Community, wenn du uns auch hier unterstützen würdest. Wir würden deine Hilfe sehr schätzen. |
Nun wird ein Fehler zwar erkannt, aber dann einfach der Rest der Adresse nicht mehr gelesen. Wenn man diesen Code anfassen möchte dann sollte man (auch als Vorbereitung für Arduino 3) das ganze IPv6-Ready machen, und dafür könnte man auf die Funktionen von lwIP zurückgreifen. Da muss aber etwas mehr geändert werden als nur diese Funktion. |
Die Vorbereitung auf IPv6 ist etwas umfangreicher. Das stimmt und wir haben uns in der Vergangenheit auch schon Gedanken gemacht. Das würde viele Vorteile bringen. Es macht Sinn den aktuellen Code so gut wie möglich auf eine stabile Version zu bringen, damit zumindest 80% der Nutzer zufrieden sind. Erst dann kann man zu den 20% übergehen und gleichzeitig evtl. ESP8266 "archivieren". Daher bin ich dran den Code allgemein zu verbessern. |
Folgende Ideen habe ich noch dazu: strtol ist flexibel, aber nicht die schnellste Methode zur Konvertierung von Strings in Zahlen. Eine manuelle Konvertierung könnte schneller sein. Möglichkeit Nr.1:
|
Möglichkeit Nr.2:
|
Möglichkeit Nr.3:
|
Das wäre die Lösung mit atoi:
|
An diesem Code die Performance zu optimieren ist ja sowieso eher eine akademische Aufgabe, einen wirklichen Sinn macht das nun nicht, da dieser Code ausschließlich bei Änderungen im Webinterface ausgeführt wird. Ob dieser Code nun ein paar Taktzyklen mehr oder weniger braucht macht in der Praxis eigentlich keinen Unterschied, aber es ist natürlich spannend sich so eine Funktion herauszupicken und dann daran zu optimieren so viel wie irgendwie möglich. Bei sscanf würde ich das mit der Schnelligkeit mal ganz schnell wieder vergessen, da wird die Anzahl der Operationen und Komplexität dieser eher in die Höhe getrieben. Mein Ansatz wäre mit inet_pton zu konvertieren, und dann das Ergebnis als u32_t zurückzugeben und so weiter zu verarbeiten. Man kann aber nicht den u32_t in das byte-array schreiben, das verletzt die strict aliasing rule (auch wenn es in bestimmten Fällen funktionieren würde). Der Compiler wird einem das aber angemessen optimieren. Nebenbei wäre es (bis zu einem gewissen Grad) schon die Vorbereitung auf IPv6. |
Die optimierte Version der Funktion
ip2Arr
bietet mehrere Performance-Verbesserungen im Vergleich zur ursprünglichen Version. Hier sind die wichtigsten Punkte:Verbesserungen und Einsparungen
Verwendung von
strtol
:atoi
, was ineffizient ist, da es den String mehrfach durchsucht.strtol
konvertiert den String direkt in einen Long-Wert und gibt den Pointer auf den nächsten nicht-konvertierten Charakter zurück. Dies spart Zeit, da die Konvertierung und das Finden der nächsten Zahl in einem Schritt erledigt werden.Reduzierung der Schleifenvariable:
i
war alsuint8_t
deklariert, was bereits effizient ist.uint8_t
bereits optimal ist.Vermeidung von mehrfachen
containsKey
-Aufrufen:atoi
mehrmals auf, was ineffizient ist.strtol
verwendet, was die Anzahl der Funktionsaufrufe reduziert.Quantitative Einsparungen
strtol
reduziert die Anzahl der Funktionsaufrufe und die Zeit, die für die Konvertierung und das Finden der nächsten Zahl benötigt wird. Dies kann die Ausführungszeit der Funktion erheblich verkürzen, insbesondere bei langen IP-Strings.uint8_t
für die Schleifenvariable und die direkte Konvertierung mitstrtol
spart Speicher, da weniger temporäre Variablen und weniger Speicher für Funktionsaufrufe benötigt werden.Zusammenfassung
Die optimierte Version der Funktion
ip2Arr
bietet eine effizientere und schnellere Möglichkeit, einen IP-String in ein Array vonuint8_t
zu konvertieren. Die Hauptvorteile sind die Reduzierung der Anzahl der Funktionsaufrufe und die effizientere Nutzung des Speichers. Diese Verbesserungen führen zu einer besseren Performance und einem geringeren Speicherverbrauch, was besonders wichtig ist für eingebettete Systeme wie den ESP32-S3.