Aggiornamento: come mi sarei aspettato, il solido consiglio della comunità in risposta a questa domanda era di "misurarlo e vedere". chibacity posted an answer con alcuni test davvero belli che hanno fatto questo per me; nel frattempo, ho scritto una mia prova; e la differenza di prestazioni che ho visto era in realtà così enorme che I felt compelled to write a blog post about it.Utilizzo di ThreadStatic per sostituire gli utenti locali costosi - buona idea?
Tuttavia, dovrebbe anche riconoscere che l'attributo Hans's explanationThreadStatic
non è davvero libero e di fatto si basa su un metodo di CLR di supporto per lavorare la sua magia. Ciò rende tutt'altro che ovvio se si tratterebbe di un'ottimizzazione appropriata da applicare in caso arbitrario.
La buona notizia per me è che, nel caso mio, sembra aver fatto un grande miglioramento.
Ho un metodo che (tra le altre cose) un'istanza di alcuni array di medie dimensioni (~ 50 elementi) per un paio di variabili locali.
Dopo aver effettuato alcuni profili, ho identificato questo metodo come un collo di bottiglia per le prestazioni. Non è che il metodo richieda un tempo estremamente lungo per chiamare; piuttosto, è semplicemente chiamato molte volte, molto rapidamente (da centinaia di migliaia a milioni di volte in una sessione, che sarà di diverse ore). Quindi anche i miglioramenti relativamente piccoli alle sue prestazioni dovrebbero essere utili.
Mi è venuto in mente che forse invece di assegnare un nuovo array per ogni chiamata, potrei usare i campi contrassegnati con [ThreadStatic]
; ogni volta che viene chiamato il metodo, controlla se il campo è inizializzato sul thread corrente e, in caso contrario, lo inizializza. Da quel punto in poi tutte le chiamate sullo stesso thread avranno un array tutto pronto per andare in quel punto.
(Il metodo inizializza ogni elemento della matrice stessa, in modo da avere elementi "stantio" nella matrice non dovrebbe essere un problema.)
La mia domanda è semplicemente questa: Ti sembra una buona idea? Ci sono dei problemi nell'usare l'attributo ThreadStatic
in questo modo (ad esempio, come ottimizzazione delle prestazioni per mitigare il costo dell'istanziazione di nuovi oggetti per le variabili locali) di cui dovrei essere a conoscenza? Forse le prestazioni di un campo ThreadStatic
non sono grandiose; ad esempio, c'è un sacco di "cose" in più in background, con il suo insieme di costi, per rendere possibile questa funzione?
E 'anche abbastanza plausibile a me che ho sbagliato a cercare anche di ottimizzare qualcosa a buon mercato (?) Come un 50-elemento della matrice, e se è così, sicuramente me lo faccia sapere, ma il generale domanda ancora detiene.
Provalo e misura. Suppongo che l'accesso a un oggetto locale thread non sia libero, anche se forse più economico della riallocazione. – 9000
Provalo e misuralo. – BRampersad
Se si è in grado di utilizzare .NET4, non dimenticare ['ThreadLocal'] (http://msdn.microsoft.com/en-us/library/dd642243.aspx). La giuria è ancora fuori se non ha superato 'ThreadStatic', ma è un po 'più facile da usare (e avere ragione). Ti consigliamo di considerare 'ThreadLocal ' e includerlo nei tuoi benchmark. –
LukeH