Domanda

Supponiamo che io sono un puntatore di tipo char * a stringa unicode, e so che la lunghezza:

char* _unmanagedStr;
int _unmanagedStrLength;

e ho 2 modi per convertirlo in stringa di .NET:

Marshal.PtrToStringUni((IntPtr)_unmanagedStr, _unmanagedStrLength);

e

new string(_unmanagedStr, 0, _unmanagedStrLength);

Nel mio test, entrambe le chiamate mi dà esattamente lo stesso risultato, ma il new string() è come volte 1,8 volte più veloce di Marshal.PtrToStringUni().

Perché è che differenza di prestazioni? C'è qualche altro differenza funzionale tra tutti e due?

È stato utile?

Soluzione

A giudicare dal codice sorgente disponibile (rotore), lo System.String (char *) costruttore utilizza un percorso di codice pesantemente ottimizzato attraverso CtorCharPtr (), assegna la stringa con FastAllocateString (). Marshal.PtrToStringUni () segue un percorso di codice completamente diverso, è scritto in C ++ e sembra essere la copia della stringa due volte, senza il beneficio di un "allocatore veloce".

Chiaramente, non è la stessa programmatori hanno lavorato su questo. Quasi certamente nemmeno la stessa squadra in quanto il codice si inserisce un modello di programmazione diversa. Il manager più vicino in comune era probabilmente quattro livelli fino.

Non sono sicuro di come sarebbe utile, usare quello veloce. Contrattempi potrebbero generare un simile tipo di eccezioni su Windows.

Altri suggerimenti

Il secondo non è compatibile con CLS, richiede codice pericoloso e potrebbe avere un comportamento indeterminato ed è per questo probabilmente è più veloce. C'è anche la necessità di il puntatore l'indirizzo non gestito o il collettore garbage potrebbero destinarlo che leades ad un codice più ingombra. A meno che tu hai stabilito che si tratta di un collo di bottiglia per la vostra applicazione probabilmente si vorrà utilizzare il funzione PtrToStringUni .

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