La boxing converte un tipo di valore in un tipo di oggetto. O come dice MSDN, boxing è una "operazione per avvolgere la struttura all'interno di un oggetto di tipo riferimento sull'heap gestito".C# - È possibile raggruppare le scatole?
Ma se si tenta di approfondire guardando il codice IL, si vede solo la parola magica "scatola". Classe segreto
Speculare, immagino che il runtime ha una sorta di farmaci generici a base nella manica, come Box<T>
con una proprietà public T Value
, e la boxe un int sarebbe simile:
int i = 5;
Box<int> box = new Box<int>;
box.Value = 5;
unboxing l'int sarebbe essere molto più economico: return box.Value;
Sfortunatamente, la mia applicazione server con prestazioni elevate fa un bel po 'di boxe, in particolare di decimali. Peggio ancora, queste scatole sono di breve durata, il che mi fa sospettare che io paghi due volte, una volta per istanziare la scatola e poi di nuovo per la raccolta dei rifiuti dopo che ho finito.
Se mi stavo dedicando questa memoria, considererei l'uso di un pool di oggetti qui. Ma dal momento che la creazione dell'oggetto reale è nascosta dietro una parola magica nell'IL, quali sono le mie opzioni?
Le mie domande specifiche:
- Esiste un meccanismo esistente per indurre il runtime di prendere scatole da un pool piuttosto che instanciating?
- Qual è il tipo di istanza creata durante il pugilato? È possibile assumere manualmente il controllo del processo di boxe, ma essere comunque compatibile con l'unboxing?
Se quest'ultima domanda sembra strano, quello che voglio dire è che ho potuto creare il mio Box<T>
o DecimalBox
classe, piscina, e box/Unbox manualmente. Ma non voglio dover andare a modificare i vari punti del codice che consumano il valore in scatola (aka unbox it).
Avete considerato solo la riduzione delle operazioni di boxing utilizzando generici/oggetti personalizzati/ecc.? L'istruzione 'box' è intenzionalmente opaca, anche se puoi ovviamente imitarla tramite la tua classe' Box '. –
dlev
"la mia applicazione fa un bel po 'di boxe". Un gioco strano, l'unica mossa vincente non è quella di giocare. –
"Peggio ancora, queste caselle sono di breve durata, il che mi fa sospettare pago due volte, una per instanciating la scatola e poi di nuovo per la raccolta dei rifiuti la casella dopo ho finito con esso." L'hai profilato, vero? Sai che il GC è un collo di bottiglia nella tua applicazione perché hai misurato, e non perché hai indovinato. L'unica volta in cui sono riuscito a ottenere il limite di GC è stato l'allocazione frequente di array di byte di grandi dimensioni. Se le collezioni di Gen0 sono un collo di bottiglia, dovresti riconsiderare il tuo design. – CodesInChaos