Wenn Ihre App XML-Nachrichten von etwa 700 Byte weitergibt, die in 65 Byte großen Google-Protokollnachrichten oder 85 Byte großen ASN.1-Nachrichten enthalten sein könnten, dann wird es wahrscheinlich keine Rolle spielen. Aber wenn es eine Million etwas pro Sekunde verarbeitet, würde ich die Kosten für das Hinzufügen von 2 kompletten Lese-/Änderungs-/Schreibzyklen beim Weitergeben eines Zeigers nicht außer Acht lassen.
Ein kompletter Lese-/Änderungs-/Schreibvorgang dauert etwa 50 ns, also sind zwei 100 ns. Dies sind die Kosten für einen Lock-Inkrement und ein Lock-Dekrement – das Gleiche wie bei 2 CAS-Operationen. Dies entspricht der Hälfte einer Reservierung und Freigabe eines Windows-Kritischen Abschnitts. Dies im Vergleich zu einem einzelnen Maschinenzyklus-Push (400 PICO-Sekunden auf einer 2,5-GHz-Maschine).
Und das beinhaltet nicht einmal die anderen Kosten für die Ungültigmachung der Cache-Zeile, die tatsächlich den Zähler enthält, die Auswirkungen der BUS-Sperre auf andere Prozessoren usw.
Das Übergeben von Smart Pointern per const-Referenz ist fast IMMER vorzuziehen. Wenn der Caller keinen neuen Shared Pointer erstellt, wenn er die Lebensdauer des Pointee garantieren oder kontrollieren möchte, dann handelt es sich um einen Fehler beim Caller. Einfach so thread-sichere Referenzzähl-Smart-Pointer per Wert weiterzugeben, ist einfach nur eine Einladung für Leistungseinbußen.
Die Verwendung von Referenzzählten Pointern vereinfacht zweifellos die Lebensdauer, aber shared Pointer per Wert weiterzugeben, um sich gegen Fehler beim Caller zu schützen, ist schlicht und ergreifend Unsinn.
Ein übermäßiger Einsatz von Referenzzählung kann schnell ein schlankes Programm, das 1 Million Nachrichten pro Sekunde verarbeiten kann, in ein fettes verwandeln, das auf derselben Hardware nur noch 150.000 Nachrichten pro Sekunde verarbeiten kann. Plötzlich benötigen Sie ein halbes Rack von Servern und 10.000 Dollar pro Jahr an Stromkosten.
Sie sind immer besser dran, wenn Sie die Lebensdauer Ihrer Objekte ohne Referenzzählung verwalten können.
Ein Beispiel für eine einfache Verbesserung ist, wenn Sie beispielsweise ein Objekt verzweigen möchten und Sie die Breite der Verzweigung (sagen wir n) kennen, dann inkrementieren Sie um n, anstatt bei jeder Verzweigung einzeln zu inkrementieren.
Übrigens, wenn die CPU ein Sperrpräfix sieht, denkt sie wirklich: "Oh nein, das wird wehtun."
All das gesagt habend stimme ich mit allen überein, dass Sie den Hotspot überprüfen sollten.