Domanda
Quando chiami CoInitializeEx
, è possibile specificare i seguenti valori per dwCoInit
:
typedef enum tagCOINIT {
COINIT_MULTITHREADED = 0x0,
COINIT_APARTMENTTHREADED = 0x2,
COINIT_DISABLE_OLE1DDE = 0x4,
COINIT_SPEED_OVER_MEMORY = 0x8,
} COINIT;
Cosa fa il valore dal titolo suggestivo "velocità rispetto alla memoria"?Viene ignorato in questi giorni in COM?
Soluzione
Non ho idea se sia ancora utilizzato, ma era destinato a modificare l'equilibrio utilizzato dagli algoritmi COM.
Se avessi tonnellate di memoria e volessi la velocità a tutti i costi, imposteresti quella bandiera.
In ambienti con poca memoria, lasciare disattivato il flag favorirebbe un utilizzo ridotto della memoria.
A quanto pare, il meraviglioso Raymond Chen (Di "La vecchia cosa nuova" fama) è ormai intervenuto sull’argomento e, malgrado ciò che era quella bandiera significava da fare, apparentemente non fa nulla.
Vedere Cosa fa il flag COINIT_SPEED_OVER_MEMORY su CoInitializeEx? per ulteriori dettagli:
Quando dovresti abilitare questa modalità?Non importa, perché per quanto ne so, non c'è codice da nessuna parte in COM che cambi il suo comportamento a seconda che il processo sia stato messo in questa modalità!Sembra che il flag sia stato aggiunto quando è stato introdotto DCOM, ma non è mai stato collegato a nulla.(O qualsiasi codice collegato non è mai stato spedito.)
Anche http://archives.neohapsis.com/archives/microsoft/various/dcom/2001-q1/0160.html da Steve Swartz, uno degli architetti COM+ originali:
COINIT_SPEED_OVER_MEMORY viene ignorato da COM.
Altri suggerimenti
Uno dei flag che puoi passare a CoInitializeEx è COINIT_SPEED_OVER_MEMORY, che è documentato come: https://msdn.microsoft.com/en-us/library/ms678505(v=VS.85).aspx
COINIT_SPEED_OVER_MEMORY:Scambia la memoria con la velocità.Questa documentazione è già vaga poiché non dice in quale direzione viene effettuato lo scambio.Stai riducendo la memoria per aumentare la velocità o stai aumentando la memoria riducendo la velocità?In realtà non è nessuno dei due:Se passi questo flag, stai indicando a COM di consumare più memoria nel tentativo di ridurre l'utilizzo della CPU, presupponendo che tu funzioni più velocemente eseguendo meno cicli.¹
La richiesta è una transizione unidirezionale per processo.Una volta che qualcuno in qualsiasi punto del processo mette COM in modalità speed-over-memory, il flag rimane impostato e rimane impostato fino all'uscita del processo.
Quando dovresti abilitare questa modalità?Non importa, perché per quanto ne so, non c'è codice da nessuna parte in COM che cambi il suo comportamento a seconda che il processo sia stato messo in questa modalità!Sembra che il flag sia stato aggiunto quando è stato introdotto DCOM, ma non è mai stato collegato a nulla.(O qualsiasi codice collegato non è mai stato spedito.)
¹ Come sai, consumare più memoria non è una garanzia che correrai effettivamente più velocemente, perché un utilizzo maggiore della memoria aumenta le possibilità che ciò di cui hai bisogno subisca un errore di cache L1 o un errore di pagina, che ti costerà caro in termini di tempo di attesa ( anche se non nell'utilizzo della CPU).