PDA

View Full Version : [C/C++] Cerco aiuto per capire la lentezza di una DLL


Ntropy
06-05-2009, 14:50
Salve a tutti,
sto programmando un'applicazione o meglio reingegnerizzando un software che prende in input delle immagini e fa alcuni calcoli su di esse

Il software è composto da vari file oggetto che contengono funzioni ecc. ecc a cui linko poi il main per creare l'eseguibile e fino a qui tutto bene.

Succesivamente ho dovuto creare una seconda versione di questo software in cui tutti i file oggetto venissero fusi in una sola dll da richiamare poi con un main apposito ed anche questo è andato bene ma nella fase dei test......


...la versione con la dll risulta drammaticamente più lenta della prima versione nel calcolo. Circa 10 volte più lenta :cry: :cry: :cry:

Allora vi chiedo? E' necessario qualche ottimizzazione, oppure non creare una sola dll ma più dll, programmare la dll in modo diverso, compilare in qualche modo specifico???

ide utilizzato: devc++
compilatore: gcc-4.2.1


grazie

Ntropy
07-05-2009, 16:34
ho risolto, avevo sbagliato a compilare :D :D

adesso però ho un problema quando uso GetProcAddress in pratica sembra non trovare la funzione nella dll.

qualche suggerimento?

advapi
07-05-2009, 16:43
ciao,
scusa potresti pastare il codice comprensivo della loadlibrary?
grazie ciao

Ntropy
07-05-2009, 16:50
typedef int (*importFunction)(const char**, int, bool, bool, bool, const char*, const char*, double*, double*, int);

importFunction LocateLandmarks;
int result;

// Load DLL file
HINSTANCE hinstDLL = LoadLibrary("mystasm.dll");
if (hinstDLL == NULL) {
printf("ERROR: unable to load DLL\n");
return 1;
}

// Get function pointer
LocateLandmarks = (importFunction)GetProcAddress(hinstDLL, "LocateLandmarks");
if (LocateLandmarks == NULL) {
printf("ERROR: unable to find DLL function\n");
FreeLibrary(hinstDLL);
return 1;
}


ho generato il .def con dlltool credo di non aver sbagliato ma cmq posto pure quello

; dlltool -z mystasm.def --output-exp mystasm.exp mystasm.o
EXPORTS
; LocateLandmarks(char const**, int, bool, bool, bool, char const*, char const*, double*, double*, int)
_Z15LocateLandmarksPPKcibbbS0_S0_PdS2_i @ 1

!k-0t1c!
07-05-2009, 17:07
Devi usare extern "C" nella dll per LocateLandmarks altrimenti il nome verrà decorato come da convenzione per il C++ e il risultato sarà che GetProcAddress fallirà salvo qualora tu cerchi di ottenere l'indirizzo della funzione con il nome decorato (che compare nell'ultima riga del .def, che a sua volta in realtà credo che nel tuo caso sia inutile).

Ntropy
07-05-2009, 18:12
Devi usare extern "C" nella dll per LocateLandmarks altrimenti il nome verrà decorato come da convenzione per il C++ e il risultato sarà che GetProcAddress fallirà salvo qualora tu cerchi di ottenere l'indirizzo della funzione con il nome decorato (che compare nell'ultima riga del .def, che a sua volta in realtà credo che nel tuo caso sia inutile).

sei grande!!! ho risolto

se passi da Fisciano ti meriti una birra :cincin:

p.s.
grazie a tutti