Domanda

Continuando la discussione dal intesa VS2010 C # parallelo profilazione risultati ma più per il punto:

Ho molti fili che opera in parallelo (utilizzando Parallel.For / ciascuno), che utilizza molte allocazioni di memoria per piccole classi.

Questo crea una contesa sul filo allocatore di memoria globale.

C'è un modo per istruire NET per preallocare un pool di memoria per ogni thread e fare tutte le allocazioni da questa piscina?

Attualmente la mia soluzione è mia attuazione del pool di memoria (array allocati globalmente di oggetto di tipo T, che vengono riciclati tra i fili) che aiuta molto ma non è efficiente perché:

  1. Non posso istruire .NET di destinare da una fetta di memoria specifica.
  2. ho ancora bisogno di chiamata nuovi più volte per allocare la memoria per le piscine.

Grazie,
Aggeo

È stato utile?

Soluzione

Ho cercato per due giorni cercando di trovare una risposta alla stessa questione si aveva. La risposta è è necessario impostare la modalità di raccolta dei rifiuti alla modalità Server. Per impostazione predefinita, la raccolta dei rifiuti modalità impostata sulla modalità Workstation. Impostazione garbage collection in modalità Server fa sì che il mucchio riuscito a diviso in sezioni a gestione separata, una per CPU. Per fare questo, è necessario aggiungere un ambiente di configurazione al file app.config.

<runtime>
   <gcServer enabled="true"/>
</runtime>

La differenza di velocità sul mio 12-core Opteron 6172 è stato drammatico!

Altri suggerimenti

Il garbage collector non alloca memoria.

E 'suona più come si sta assegnando un sacco di piccoli oggetti temporanei e alcuni oggetti a lungo vissuto, e il garbage collector sta spendendo un sacco di tempo di immondizia di raccolta degli oggetti temporanei in modo la vostra applicazione non ha bisogno di richiesta di più la memoria dal sistema operativo. Da .NET Framework 4 Advanced Development - Garbage Collection :

  

Fino a quando lo spazio di indirizzi è disponibile nel mucchio gestito, il runtime continua ad allocare lo spazio per i nuovi oggetti. Tuttavia, la memoria non è infinita. Alla fine il garbage collector deve eseguire una raccolta per liberare memoria.

La soluzione:. Do non allocare un sacco di piccoli oggetti temporanei La pagina su Garbage Collection e prestazioni potrebbe anche essere utile.

Si potrebbe pre-allocare un gruppo di oggetti, e tenerli in gruppi destinati thread separati. Tuttavia, è probabile che non sarà possibile ottenere alcun migliore prestazione da questo.

Il garbage collector è appositamente progettato per gestire piccoli oggetti di breve durata in modo efficiente. Se si mantiene gli oggetti in una piscina, sono a lunga durata e sopravviveranno una garbage collection, che a sua volta significa che essi verranno copiati alla seconda generazione mucchio. Questa copia sarà più costoso di una semplice assegnazione di nuovi oggetti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top