.NET: ThreadStatic vs. Sperre {}. Warum verschlechtert ThreadStaticAttribute die Leistung?

9

Ich habe ein kleines Testprogramm geschrieben und war überrascht, warum lock {} solution schneller funktioniert als lock-free, aber mit [ThreadStatic] Attribut über der statischen Variable.

[ThreadStatic] Snippet:

%Vor%

Sperren {} Snippet:

%Vor%

Auf meinem Computer dauert das erste Snippet 4,2 Sekunden; Sekunden - 3,2 Sekunden, das ist 1 Sekunde schneller. Ohne ThreadStatic und Sperre - 1,2 Sekunden.

Ich bin neugierig, warum [ThreadStatic] Attribut in diesem einfachen Beispiel so viele zur Programmlaufzeit hinzufügt?

UPDATE : Es tut mir sehr leid, aber diese Ergebnisse beziehen sich auf DEBUG build. Für RELEASE eins habe ich völlig unterschiedliche Zahlen: (1.2; 2.4; 1.2). Für% co_de waren die Zahlen (4.2; 3.2; 1.2).

Für DEBUG build scheint es also keine RELEASE Leistungseinbuße zu geben.

    
Roman 20.08.2011, 12:24
quelle

2 Antworten

6

Für RELEASE Build scheint es fast keine [ThreadStatic] Leistungseinbuße zu geben (nur eine kleine Strafe für moderne CPUs).

Hier kommt der dis-Assembly-Code für ms_Acc += one ; Für RELEASE Optimierung ist aktiviert:

Nein [ThreadStatic] , DEBUG :

%Vor%

Nein [ThreadStatic] , RELEASE :

%Vor%

[ThreadStatic] , DEBUG :

%Vor%

[ThreadStatic] , RELEASE :

%Vor%     
Roman 23.08.2011, 07:10
quelle
-1

Sie haben zwei Codezeilen, die ms_Acc aktualisieren. Im Fall lock haben Sie eine einzige Sperre für beide, während sie im Fall ThreadStatic einmal für jeden Zugriff auf ms_Acc auftritt, d. H. Zweimal für jede Iteration Ihrer Schleife. Dies ist im Allgemeinen der Vorteil der Verwendung von lock . Sie können die gewünschte Granularität auswählen. Ich vermute, dass der RELEASE-Build diesen Unterschied optimiert hat.

Ich würde gerne sehen, ob die Performance sehr ähnlich oder identisch wird, wenn Sie die for-Schleife in einen einzigen Zugriff auf ms_Acc ändern.

    
Daniel B 23.08.2011 05:42
quelle

Tags und Links