ZIEL: Ich habe eine Frage zu den Leistungen in einer Microsoft Windows-Konsolenanwendung in C++, die mit der Verarbeitung von Datenrahmen von einem seriellen COM-Port behandelt. In C und Embedded System (die ich die meisten meiner Erfahrung habe) ich normalerweise große Puffer zur Kompilierzeit zuordnen. Aber woran ich gerade arbeite, ist eine Software, die einen seriellen COM Port unter Verwendung eines logischen Protokolls verwaltet, das unter Windows läuft (eine Software der oberen Ebene interagiert damit, um mit eingebetteten Systemen zu kommunizieren, die in einem seriellen Bus verbunden sind). , und RAM und CPU-Geschwindigkeit sind kein Problem, ich nehme Vorteile der Objekte Fähigkeit von C++.C++ - Leistungsempfehlung für die Speicherzuweisung
MEINE LÖSUNG: Also, was ich tue, ist, wenn ich einen Datenrahmen erhalte, habe ich eine Klasse, die alle Informationen wie Rahmentyp (Ack-Antwort, Nack-Antwort, Ack-Anfrage usw.), Quelle und Ziel speichern kann Knotenadresse und Payloads (denen ich dynamisch Puffer von dynamischer Länge von 0 bis 1024 Bytes zuordne). Was ich im Moment mache, ist, ich habe eine Kompilierzeit reserviert Puffer von 5 Bytes, die den Header in der Klasse speichert, die das Protokoll behandelt. Sobald ich einen vollständigen 5-Byte-Header empfangen habe, benutze ich das Feld für die Nutzlastgröße, um einen Puffer zum Speichern der Nutzdaten zuzuweisen, einen vollen Frame, ich berechne das crc16 und validiere die Daten, um gültig zu sein, und wenn es wahr ist, bin ich als Erstellen eines Frame-Klassenobjekts, das alle Informationen plus den Zeiger auf den zugewiesenen Puffer speichert, der die Payload speichert (also keine Kopie benötigt wird), dann das Paketobjekt an die darüber liegende Ebene zur weiteren Verarbeitung übergibt, was auch immer der Frame Der Objektdestruktor wird den Puffer, der die Nutzlast speichert, freigeben, sobald das Rahmenobjekt aus den obigen Schichten der Software gelöscht ist. Ist das ein guter Ansatz, oder ich töte die PC-Leistung. Die TX-Planung erfolgt auf ähnliche Weise. Irgendwelche Ratschläge?
(Erstellen eines Pufferpools bei der Initialisierung und Anforderung/Rückgabe an/aus dem Pool zur Laufzeit anstatt neu/delete aufzurufen), ist dieser Ansatz, was ich in der eingebetteten Seite tun, wegen der begrenzten Ressourcen und CPU Geschwindigkeiten. Ich wollte einen anderen Ansatz am PC ausprobieren, da Speicher und CPU-Geschwindigkeit kein Problem sind. Dynamische Allokation ist für mich eine Art neue Sache, und ich habe gelesen, dass es für Performances wirklich ein Flaschenhals ist. Ich war neugierig, ob das ein besserer Weg ist. Welche Header-Datei muss ich zum Testen von TCMalloc hinzufügen? irgendwelche Referenzdokumentation? Ich danke dir sehr. – Dominick
@Dominick Das erste, was ich tun würde, ist Leistungsprofil Ihres Codes mit etwas wie gprof (https://sourceware.org/binutils/docs/gprof/). Dies wird Ihnen sagen, ob die Zuweisung wirklich ein Engpass in Ihrem Anwendungsfall ist. TCMalloc ist ein Ersatz für neue/löschen von Google erstellt, können Sie es hier überprüfen (http://goog-perftools.sourceforge.net/doc/tcmalloc.html) – Erix