Frank schrieb:
> Ja ehrlich... So zumindest in vielen, oder allen Tutorials die auf der
> Pubsub lib beruhen?
Da ist dann ein wenig Grundlagenwissen über die Programmiersprache und
die Libraries von Vorteil.
Die Original-Beispiele machen das übrigens nicht so. Die haben zwar auch
diese Schleife über "message", schieben das aber Buchstabenweise über
die Serielle Schnittstelle raus, d.H. da wird kein String
zusammengesetzt.
Irgendjemand hat dann wohl mal das Serial.print(char) durch den
String-append ersetzt, sich nichts dabei gedacht, und das wurde dann
x-mal im Internet rumkopiert.
> Aber ich stecke da nicht so tief drin, als das ich
> eine entsprechende lib optimieren könnte. Man freut sich sicher über
> andere Ansätze.
Das Problem ist, dass der String bei jedem Anhängen eines Buchstaben
verlängert wird, und dabei potentiell neuen Speicher anfordert, und
dabei erstmal alles umkopieren muss.
Ergibt damit quadratische Komplexität.
Am PC (C++, std::string) umgeht man das indem man einfach
verschwenderisch mit dem Speicher umgeht, und die reservierte
Speichergröße jedesmal verdoppelt.
Ergibt dann "amortised constant time" für das append.
Am µC ist das nicht so implementiert, da ist der Speicher knapp.
Verbesserung:
Vor der for-Schleife einmal mit
messageTemp.reserve(length)
den nötigen Speicherplatz vorab reservieren.
Oder statt der Schleife einfach mit
messageTemp.concat(message, length)
die gesamte Payload auf einmal in den String schieben.