Wenn Ihre App 700-Byte-XML-Nachrichten übergibt, die in 65-Byte-Google-Protokollnachrichten oder 85-Byte-ASN.1-Nachrichten enthalten sein könnten, spielt das wahrscheinlich keine Rolle. Aber wenn es eine Million etwas pro Sekunde verarbeitet, dann würde ich die Kosten für das Hinzufügen von 2 vollen Lese-Änderungsschreib- (RMW-) Zyklen zum Übergeben eines Zeigers nicht verwerfen.
Ein voller Lese-Modifikations-Schreibvorgang liegt in der Größenordnung von 50 ns, also sind zwei 100 ns. Diese Kosten sind die Kosten eines Lock-Inc und eines Lock-Dec - das gleiche wie 2 CAS's. Dies ist die Hälfte eines Windows-kritischen Abschnitts Reserve und Release.Dies wird verglichen mit einem einzigen Maschinenzyklus-Push (400 PICO Sekunden auf einer 2,5 GHz-Maschine)
Und dies beinhaltet nicht einmal die anderen Kosten für das Ungültigmachen der Cache-Zeile, die tatsächlich die Zählung enthält, die Auswirkungen der BUS-Sperre auf anderen Prozessoren usw. usw.
Smart Zeiger durch const Referenz übergeben ist fast immer zu bevorzugen. Wenn der Angerufene keinen neuen geteilten Zeiger erstellt, wenn er die Lebensdauer des Pointees garantieren oder kontrollieren will, dann ist es ein Fehler im aufgerufenen. Willy-Nilly Passing Thread sichere Referenz Zählen intelligente Zeiger um Wert läuft nur nach Leistung Treffer fragen.
Die Verwendung von Referenz gezählten Zeigern vereinfacht die Lebensdauer zweifellos, aber freigegebene Zeiger nach Wert zu übergeben, um sich gegen Defekte im Angerufenen zu schützen, ist schierer und völliger Unsinn.
Übermäßige Verwendung der Referenzzählung kann in Kürze ein schlankes Programm, das 1 mm Nachrichten pro Sekunde (mps) verarbeiten kann in eine fette, die 150 k mps auf der gleichen Hardware verarbeitet. Plötzlich braucht man ein halbes Rack Server und 10000 $ Strom pro Jahr.
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, sagen wir, wenn Sie ein Objekt fächern und Sie wissen, dass die Breite des Fanouts (sagen wir n) um n erhöht wird, anstatt einzeln bei jedem Fanout zu erhöhen.
BTW, wenn die CPU ein Lock-Präfix sieht, sagt es wirklich "Oh nein das wird weh tun".
Alles was gesagt wird, ich stimme allen zu, dass Sie den Hot Spot überprüfen sollten.
Heh. Keine Antwort hier, aber ich liebte einfach die Art, wie der Titel formuliert wurde. Ich stelle mir vor, wie die CPU munter Befehle ausführt, wenn sie plötzlich einen geteilten Zeigerbefehl an der Rückseite der Pipeline sieht. "Oh nein, das wird huuuuurt ...... OW!" –
Was lässt Sie denken, dass das Problem geteilte Zeiger ist? –
Leute sagen, dass sie CPU-Zeit verschwenden, das ist es: P – Guest