2016-12-02 5 views
-1

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?

Antwort

0

Ihre Lösung ist in Ordnung. Das Zuweisen von Puffern zur Laufzeit wird nicht als schlechte Methode angesehen, wenn die Größen zur Kompilierungszeit nicht bekannt sind. Es sieht auch so aus, als ob Sie darauf achten, die Puffer nicht unnötigerweise zu kopieren, was eine gute Übung ist.

Wenn Sie sich Sorgen um die Leistung machen, können Sie einen Drittanbieter-Allokator wie TCMalloc oder JEMalloc versuchen, obwohl diese in der Regel mehr mit stark gefädelten oder fragmentierten Speicherbereichen helfen.

Wenn diese Puffer im Allgemeinen ähnlich groß sind und ständig zugeordnet und freigegeben werden, können Sie bei der Initialisierung einen Pufferpool erstellen und sie zur Laufzeit/aus dem Pool anfordern bzw. zurückgeben, anstatt new/delete aufzurufen.

+0

(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

+0

@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

Verwandte Themen