Caricamento di una DLL unmanaged con C#: grande differenza di prestazioni tra applicazione console e webapp su IIS

di Anonimizzato29228 il
6 risposte
Ho implementato un'applicazione web con C#, basata su ASP.NET. Essa carica (con LoadLibraryEx) una DLL unmanaged scritta con C++Builder.

Avendo problemi di prestazioni, ho fatto alcuni test comparativi, sempre sulla stessa macchina, invocando sempre uno stesso metodo della DLL, per molte volte, ottenendo i tempi medi di esecuzione.

Ho scoperto che la DLL:

6 Risposte

  • Grazie della risposta.
    Sì uso LoadLibraryEx.
    Dici che Kestrel sia più veloce di IIS?
    Quindi dovrei migrare l'applicazione web a .NET Core (che non ho idea di cosa comporti come impegno)?
  • Prima potresti fare un applicazione minimale in asp .net core dove verifichi se kestrel è effettivamente più veloce di IIS ,
    per fare delle prove dovresti fare il deploy delle applicazioni poichè i risultati in debug non sono sempre significativi ,
    hai valutato la possibilità di tradurre la lib c++ in c# (ovviamente se la lib c++ non è troppo complessa)? , per curiosità cosa fà la lib c++ ? , magari fai sapere , ciao
  • D'accordo, potrei fare la prova ASP.NET Core su Kestrel e misurare.
    Tradurre la libreria da C++ a C# non è fattibile a breve. Si tratta di un configuratore di prodotto, molto complesso.
    Grazie
  • Grazie serfernet e gian82, mi avete fatto fare un passo avanti!

    Ho fatto un po' di prove, che ricapitolo qua:
    • MM138CppConsole, DLL caricata da applicazione console in C++Builder: 4,922 s
    • MM138CsConsole, DLL caricata da applicazione console in C#: 5,484 s
    • MM138CsASPNETCore, DLL caricata da applicazione web ASP.NET Core in C# su Kestrel: 6,042 s
    • MM138CsASPNETCore, DLL caricata da applicazione web ASP.NET Core in C# su IIS: 9,445 s
    • MM138CsASP, DLL caricata da applicazione web ASP.NET in C# su IIS: 9,551 s
    • MM138CsASP, DLL caricata da applicazione web ASP.NET in C# su UltiDev Web Server Pro: 10,039 s
    Quindi forse ASP.NET Core in C# su Kestrel è la strada migliore.

    Tra l'altro ho bisogno di molteplici istanze di questa webapp per parallelizzare il carico di lavoro, dato che la DLL non consente parallelismo.
    Quindi immagino che dovrò lanciare molteplici istanze di Kestrel (comando "dotnet xxx.dll" lanciato da Attività pianificate all'avvio del server?), ognuna che risponde su una porta diversa e davanti dovrò metterci IIS che fa il routing delle richieste verso le istanze giuste (devo garantire che le richieste che riguardano un certo documento vengano servite sempre dalla stessa istanza).
    Se avete qualche consiglio sulla strada da seguire, vi ringrazio molto!
    Immagino che il mettere IIS davanti non rallenti l'esecuzione, ma, non essendo lui che carica la DLL, immagino che questo non succederà.

    Spero di non dover stravolgere la webapp per migrare da ASP.NET Framework a ASP.NET Core...

    Grazie ancora
Devi accedere o registrarti per scrivere nel forum
6 risposte