DLL a szybkość wykonania się kodu

0

Hey, mam takie pytanie: czy ma wpływ na szybkość wykonania się kodu (operacji) fakt, że funkcja została wywołana z DLL-ki? Chodzi mi np. o szybkość wykonania się pętli, operacje arytmetyczne etc.
Chodzi mi o to, że chcę napisać pewną klasę do analizy danych, która będzie mielić dane przez ładnych kilka chwil i zamierzam napisać ją w C++ i wstawić do DLL-ki, by móc z niej później korzystać m.in. w innym programie pisanym w innym (znacznie wolniejszym) języku. Zastanawiam się teraz, czy jeśli funkcja zostanie wywołana z DLL-ki to czy coś może na nią negatywnie wpłynąć. Np. czy szybkość wykonania takiej funkcji szybciej by się wykonała, gdybym cały kod umieścił bezpośrednio w programie pisanym w C++?
Jeśli mogą wystąpić znaczące różnice to z jakiego powodu?

Wydaje mi się, że negatywny wpływ może mieć tylko samo włączenie DLL-ki i wywołanie funkcji DLLmain(), ale to raczej nie jest znaczące...

2

Samo wywołanie funkcji może trwać dłużej, bo dochodzi dereferencja wskaźnika na tę funkcję, funkcja taka też nie zostanie zinline'owana, ale nie będzie wykonywać się wolniej. Jeśli chcesz funkcję napisać w C++ bo reszta programu jest napisana w czymś powolnym, to nie rozumiem nad czym się zastanawiasz.

Na ostatnie pytanie (czy przypisywać wszystko do C++) to już musisz sam sobie odpowiedzieć, co warto a czego nie.

0

Dzięki @Azarien!
A możesz mi jeszcze powiedzieć, czy ta dereferencja wskaźnika oraz brak inline-u dot. tylko wywoływanej funkcji (importowanej) czy wszystkich funkcji, które w tej DLL-ce się znajdują (łącznie z jakimiś pomocniczymi funkcjami)?
Chodzi mi o to, że poza funkcją główną, która będzie wywoływana w innych programach w DLL-ce będzie stworzonych wiele pomocniczych funkcji, które będą wywoływane w tej funkcji głównej, ale nie będą one wywoływane bezpośrednio w tym drugim programie tylko będą wykorzystywane w tej funkcji głównej.

Z góry dziękuję za odpowiedź i pozdrawiam

2

Szybkość funkcji nie ma znaczenia, w którym module danego procesu siedzi, jedyne co miałbyś wliczone w "koszty działalności" to czas, jaki system Windows potrzebował na załadowanie tej biblioteki i obsługę eventa DLL_PROCESS_ATTACH w DllMain(), jednak zwykle takie rzeczy robi się na starcie aplikacji i w późniejszym czasie nijak nie wpływają na prędkość działania funkcji w DLL-ce zawartych.

Polecam takie tematy na MSDN - LoadLibrary, FreeLibrary, GetProcessAdress, DLL_PROCESS_ATTACH, DLL_PROCESS_DETACH.

1

Chodzi mi o to, że poza funkcją główną, która będzie wywoływana w innych programach w DLL-ce będzie stworzonych wiele pomocniczych funkcji, które będą wywoływane w tej funkcji głównej, ale nie będą one wywoływane bezpośrednio w tym drugim programie tylko będą wykorzystywane w tej funkcji głównej.

One już mogą być inline'owane (o ile kompilator tak zdecyduje), a wywoływane są jak każda inna - bez żadnego dodatkowego narzutu.

3

a wywoływane są jak każda inna - bez żadnego dodatkowego narzutu.

nie są wywoływane jak każda inna, bo „każda inna” może być wywołana jako bezpośredni call, z adresem podanym w miejscu wywołania. adres funkcji z DLL musi być pobrany z tablicy wypełnionej przez system operacyjny (w przypadku ładowania statycznego) albo ze zmiennej wypełnionej przez programistę (w przypadku użycia LoadLibrary).
zatem funkcje z DLL mają narzut taki sam, jak wskaźniki na funkcje albo metody wirtualne.

ewentualnie call może prowadzić do tablicy zawierającej call pod właściwy adres - więc jest skok podwójny.

To jednak bez znaczenia. Algorytm w DLL wykonuje się tak samo szybko jak wykonywałby się w EXE. Nie ma powodu by kod (już po jego wywołaniu) działał wolniej.

0

Dziękuję wam wszystkim za te cenne informacje ;-).

Azarien napisał(a):

nie są wywoływane jak każda inna, bo „każda inna” może być wywołana jako bezpośredni call, z adresem podanym w miejscu wywołania. adres funkcji z DLL musi być pobrany z tablicy wypełnionej przez system operacyjny (w przypadku ładowania statycznego) albo ze zmiennej wypełnionej przez programistę (w przypadku użycia LoadLibrary).
zatem funkcje z DLL mają narzut taki sam, jak wskaźniki na funkcje albo metody wirtualne.

Nie jestem pewny, ale mam wrażenie, że piszesz o funkcjach, które ładuje się z biblioteki DLL a @Patryk27 odnosił się do funkcji, które są tylko wykorzystywane wewnątrz tej importowanej funkcji. Czy może się mylę i Ty również do nich nawiązywałeś?

3

nie są wywoływane jak każda inna, bo „każda inna” może być wywołana jako bezpośredni call, z adresem podanym w miejscu wywołania

{$ASMMODE INTEL}
Library project1;

Procedure Proc1; assembler;
asm
 xor eax, eax
end;

Procedure Proc2;
Begin
 Proc1;
End;

Exports Proc2 name 'Proc2';
End.

Proc2:

00000820  55                push ebp
00000821  89E5              mov ebp,esp
00000823  E8E8FFFFFF        call dword 0x810
00000828  C9                leave
00000829  C3                ret

Albo śpię, albo to rzeczywiście przecież wygląda, jak "zwykły" call z adresem w miejscu wywołania (ndisasm).

0

Jeszcze raz bardzo Wam dziękuję za rozwianie moich wątpliwości!
Pozdrawiam wszystkich bardzo serdecznie ;-)

1 użytkowników online, w tym zalogowanych: 0, gości: 1