2010-11-10 11 views
13

Zrobiłem bibliotekę GUI dla gier. Moje demo testowe działa z prędkością 60 klatek na sekundę. Kiedy uruchomię to demo ze statyczną wersją mojej biblioteki, zajmie 2-3% procesora w menedżerze zadań. Kiedy używam wersji DLL, używa ona około 13-15%. Czy to normalne? Czy tak, jak mogę ją zoptymalizować? Pytam już, aby użyć/O2 dla większości funkcji inlining.Czy plik DLL jest wolniejszy od łącza statycznego?

+4

Czy profilowałeś swoją aplikację? –

+1

Powinieneś profilować i widzieć, gdzie jest znacząca różnica. –

+2

Bez powodu do profilu. Niedoinformowanie o zgadywaniu powinno wystarczyć, aby dowiedzieć się, jakie wąskie gardła mogą występować w twojej aplikacji. Do diabła, nawet nie trzeba patrzeć na kod źródłowy. –

Odpowiedz

16

Nie uruchamiaj swojego licznika wydajności, dopóki plik DLL nie będzie miał możliwości wykonania jego funkcji jednorazowo. Daje to czas na załadowanie do pamięci. Następnie uruchom zegar i sprawdź wydajność. Powinien wtedy zasadniczo pasować do statycznej lib.

Należy również pamiętać, że lokalizacja ładunkowa biblioteki DLL może znacznie wpłynąć na szybkość jej ładowania. Domyślne adresy bazowe dla bibliotek DLL to 0x400000. Jeśli masz już inną bibliotekę DLL w tej lokalizacji, proces ładowania musi wykonać kosztowny krok ponownego adresowania, który jeszcze bardziej zniesie twój czas.

Jeśli masz taki konflikt, po prostu wybierz inny adres bazowy w Visual Studio.

+3

+1 za wskazanie problemów z adresem bazowym. –

+0

Problem z adresem bazowym byłby tylko problemem w czasie ładowania. –

5

Będziesz mieć obciążenie związane z ładowaniem biblioteki DLL (powinno być tylko raz na początku). Nie jest statycznie połączony z bezpośrednimi połączeniami, więc oczekiwałbym niewielkiej ilości kosztów ogólnych, ale niewiele.

Jednak niektóre biblioteki DLL będą miały znacznie wyższe koszty ogólne. Myślę o obiektach COM, chociaż mogą istnieć inne przykłady. COM dodaje wiele nakładów na wywołania funkcji między obiektami.

0

To trochę niejasne, co jest statycznie/dynamicznie powiązane. Czy biblioteka DLL twojej biblioteki jest statycznie powiązana z jej zależnościami? Czy to możliwe, że DLL wywołuje inne biblioteki DLL (które będą wolne)? Może spróbuj uruchomić profiler z valgrind na pliku wykonywalnym, aby określić, skąd pochodzi całe użycie procesora.

5

Jeśli wywołasz funkcje DLL, nie można ich włączyć dla rozmówcy. Powinieneś trochę pomyśleć o swoich granicach DLL.

Może być lepiej, jeśli twoja aplikacja ma mały bootstrap exe, który właśnie wykonuje główną pętlę w twojej bibliotece DLL. W ten sposób można uniknąć dużego obciążenia dla wywołań funkcji.

Powiązane problemy