2011-09-30 18 views
5

Ho una DLL win32 e due applicazioni che utilizzano la stessa dll. Uno è scritto usando c nello spazio non gestito e l'altro è l'applicazione .net che effettua la chiamata al codice non gestito usando Pinvokes.Prestazioni di richiamo del codice non gestito dal codice gestito

A volte le prestazioni dell'applicazione .net sono migliori dell'applicazione c. Tecnicamente parlando invocando il codice non gestito da .net si verifica un sovraccarico delle prestazioni, ma non in questo caso.

Ho controllato il riferimento a msdn e sembra esserci una sorta di pre-elaborazione che avviene prima della chiamata effettiva. Durante il collegamento viene caricata la DLL.

Voglio capire in quali scenari l'applicazione .NET supera le prestazioni?

+2

come si misura la prestazione delle due applicazioni e tutte le altre logiche sono esattamente le stesse per le due? –

+1

Generalmente, le chiamate native devono essere più veloci, guarda questo: http://www.codeproject.com/KB/dotnet/pinvokeperformance.aspx Sei sicuro che le tue misure siano corrette? –

+0

@AvadaKedavra - Ho misurato una particolare chiamata di metodo utilizzando rispettivamente cronometro e tempo per .net e c. – sundar

risposta

5

Il marshaller pinvoke è uno dei pezzi di codice ottimizzati più pesanti nel framework .NET. Molto importante, c'è un sacco di pinvoke che non è possibile vedere quando si esegue un programma gestito su un sistema operativo non gestito. La quantità di spese generali è altamente variabile. È solo una manciata di cicli cpu quando la DLL è già caricata e gli argomenti della funzione pinvoked sono semplici tipi interi. Per molte centinaia di cicli quando, per esempio, sono necessarie conversioni di stringhe.

In nessun caso è mai più veloce di una chiamata nativa. Misurare il sovraccarico che è solo una manciata di cicli con precisione è difficile. E ricorda che potresti misurare involontariamente il perf del tuo programma di test invece della chiamata pinvoke.

Problemi correlati