2010-02-02 1 views
5

Niedawno mój szef poprosił mnie o zwiększenie prędkości uruchamiania naszej aplikacji, AP został napisany w C++. AP jest trochę duży, użył 200 + dll, Windows potrzebuje dużo czasu, aby wejść do funkcji main(). Próbowałem tych dwóch sposobów, ale nadal nie mogę uszczęśliwić naszego szefa.sposoby zwiększenia szybkości uruchamiania aplikacji C++

  1. obciążenia opóźnienie dll http://msdn.microsoft.com/en-us/library/yx9zd12s(VS.80).aspx
  2. użycie Editbin aby zmodyfikować EXE http://msdn.microsoft.com/en-us/library/xd3shwhf(VS.80).aspx

Czy istnieją inne sposoby, aby ją poprawić? Z góry dziękuję.

+2

Ładowanie opóźnienia nie jest magiczne; musisz również upewnić się, że nie będziesz używał _ tych bibliotek DLL aż do momentu, gdy zaczniesz działać poprawnie. – MSalters

+2

Pytanie o oczywiste, ale czy profilowałeś startup? Co ci to powiedział? – MSalters

Odpowiedz

5

Musisz profilować swoją aplikację, aby określić prawdziwą przyczynę spowolnienia. Na przykład, może być tak, że spędzasz większość czasu w rutynowej inicjalizacji jednego z plików .dll, które ładujesz. Idź, znajdź dobre narzędzie do profilowania, a następnie ustal, gdzie jest wąskie gardło.

+0

Czy możesz polecić narzędzie do profilowania mojej aplikacji? Dzięki. –

+0

Moje ulubione narzędzie to VTune. Nie jest za darmo, ale możesz pobrać 30-dniową wersję próbną: http://software.intel.com/en-us/intel-vtune/ –

+1

Profilator nie pokaże wiele ciekawych rzeczy, chyba że wie, jak profilować dysk twardy. –

4

Jeez! Zmniejsz liczbę DLLów!

Oczywiście, jeśli załadujesz 200 plików DLL po uruchomieniu, będzie to wymagało wielu poważnych błędów strony i będzie trwało na zawsze (jak 3ds max).

Przemyśleć strategię DLL. Połącz wiele małych bibliotek DLL w większe. Poważnie wątpię, że potrzebujesz 200+.

Zobacz też Raymonda Chena: Five Things Every Win32 Programmer Needs to Know.

0

Jedną z opcji, a czystej gry umysłowe, jest zapewnienie pasek postępu na obciążenia ...

Jeśli ludzie mają coś na to patrzeć rozprasza je i sprawia, że ​​„czuje się” szybciej, dlatego istnieją lusterka między windami, które służą liczne podłogi ...

to nie pobije stoper chociaż ...

Drugą alternatywą jest re-write go używać mniej DLL. Ile z budżetu (pieniądze/czas) masz to następne pytanie

2

Kilka rzeczy Chyba trzeba wiedzieć:

  • wielu małych plików jest sposób wolniej następnie kilka dużych plików
  • Dostęp do dysku jest znacznie wolniejsze następnie dostępu do pamięci (DLL muszą być ładowane z dysku)

Zmniejszenie ilości DLL jest koniecznością w tej sytuacji. Może wtedy można łączyć, ale myślę, że jest to konstrukcja modułowa, co oznacza, że ​​w większości przypadków nie można ich łączyć.

Można również wczytać biblioteki DLL, zamiast otwierać program i ładować tylko niezbędne biblioteki DLL, aby załadować program podczas uruchamiania.

Można nawet opóźnić ładowanie bibliotek DLL, najpierw uruchamiając program z niezbędnymi bibliotekami DLL, a następnie ładując pozostałe, według ważności ważności.

+0

Modułowa nie musi oznaczać nadmiernej ilości bibliotek DLL. –

+0

To prawda. Ale niektóre modularne wzorce projektowe mogą przeszkadzać, gdy chcesz zmienić ładowanie lub strukturę plików. – Michiel

1

Jeśli masz dostęp do kodu biblioteki DLL (lub niektórych z nich), możesz wyszukać połączenia z dowiązaniami statycznymi. Jeśli możesz przekonwertować ich grupę na statyczne biblioteki, możesz znacznie przyspieszyć uruchomienie.

1

Użyj leniwej konstrukcji obiektów statycznych.

Zamiast globalnych, które uzyskać utworzone podczas rozruchu tak:

Foo foo; 
Bar bar; 

int main() 
{ 
    // Access foo and bar 
} 

Czy one zbudowane na żądanie z następującymi idiomu:

Foo & foo() 
{ 
    static Foo the_instance; 
    return the_instance; 
} 
Bar & bar() 
{ 
    static Bar the_instance; 
    return the_instance; 
} 

int main() 
{ 
    // Access objects through foo() and bar() 
} 

Pozwoli to zaoszczędzić trochę Start- czas, gdy obiekty są kosztowne w tworzeniu (np. muszą budować duże tabele przeglądowe lub wykonywać ciężkie operacje wejścia/wyjścia).

Nie pomoże to jednak w załadowaniu tych bibliotek DLL.

1

Dostajesz dobrą radę tutaj. Posiadanie wielu bibliotek DLL to jedna z tych przemijających modów, za które teraz płacisz. Ponadto inicjowanie ich może przynieść znacznie więcej niż potrzebujesz.

Istnieje prosty sposób, aby powiedzieć, co jest czasochłonne. Uruchom aplikację w środowisku IDE, takim jak Visual Studio, a podczas jej uruchamiania kliknij przycisk "Wstrzymaj" i wyświetl stos wywołań. Zrób to kilka razy. Za każdym razem zobaczysz, co robi i, co najważniejsze, dlaczego. Jeśli widzisz, że spędzasz dużo czasu robiąc coś, czego naprawdę nie potrzebujesz, wtedy to powie Ci, co naprawić.

+0

Profilowanie słabego człowieka. Miły. – Thomas

+0

@Thomas: Racja, i możesz być zaskoczony, jak skuteczne jest to: http://stackoverflow.com/questions/926266/performance-optymizacja-strategie-of-last-resort/927773#927773 –