Optymalizacje w Delphi

stg

Artykuł opisuje różnorodne metody optymalizacji Delphi:

  • przyśpieszanie uruchamiania Delphi
  • efektywne pisanie
  • zmniejszanie rozmiaru gotowej aplikacji

I. Sprawy początkowe – szybsze Delphi

  1. Jeśli w swojej aplikacji nie wykorzystujesz technologicznych ‘nowinek’, to miej na uwadze, iż im starsza wersja Delphi - tym lepiej. Poniżej znajduje się porównanie rozmiaru czystej formy w kolejnych wersjach Delphi (źródło ):
  • Delphi 2: 157,184 bajtów
  • Delphi 3: 179,712 bajtów
  • Delphi 4: 282,112 bajtów
  • Delphi 5: 294,912 bajtów
  • Delphi 6: 359,424 bajtów
  • Delphi 7: 368,128 bajtów
  1. W niektórych wersjach (przynajmniej w tych starszych) istnieje możliwość wyłączenia okna powitalnego (splashscreen'a), które pojawia się przy starcie Delphi. Do standardowego wywołania delphi32.exe wystarczy dodać dodatkowy parametr: -ns. Można też wyłączyć domyślne tworzenie pustego projektu poprzez parametr: -np. Można użyć obu tych parametrów na raz.

  2. Nawet jeśli nie korzystasz ze wszystkich komponentów, one i tak się ładują przy każdym uruchomieniu Delphi. Mo¿esz je wyłączyć wybierając z menu głównego Components, następnie Install Packages, a w wyświetlonym oknie usunąć zbędne komponenty.

  3. Zainstaluj:

II. Efektowność, a efektywność

  1. O samym pisaniu można powiedzieć, że to temat-rzeka. Wiele informacji na temat 'dobrego pisania' można znaleźć m.in. na poniższych stronach:
  1. W przypadku gdy korzystasz z plików multimedialnych (grafika, muzyka) dobrym pomysłem jest przechowywanie tych danych w pliku zasobów (RES), a następnie odwoływanie się do konkretnego zasobu np. poprzez LoadFromResourceName, LoadIcon, PlaySound itp.

  2. Nawiązując do plików multimedialnych, staraj się używać odpowiednich formatów. Zamiast standardowych bitmap (BMP) korzystaj z kompresji oferowanej przez inne formaty (JPG, PNG, GIF). Do większości z nich możesz łatwo znaleźć darmowe oprogramowanie, które jeszcze bardziej zmniejszy rozmiar Twojej grafiki - np. najlepszą kompresję PNG dokonasz przy użyciu PNG Monster. Idąc dalej tym tokiem rozumowania, pliki dźwiękowe Wave (WAV) również można skompresować przy wykorzystaniu np. kodeka Vorbis (OGG) lub MPEG Layer 3 (MP3), a jeśli zależy Tobie na jakości - może najwyższa pora przerzucić się na inny format?

  3. O ile to możliwe, staraj sie tworzyć dynamiczne formy.

  4. Zadbaj o właściwą konfigurację w menu Project, a następnie Options. W zakładce Compiler upewnij się, że opcja Optimization jest aktywna. Przy okazji włącz wyświetlanie porad (Show hints) oraz ostrzeżeń (Show warnings). Dwie ostatnie opcje nie mają wpływu na końcowy rozmiar aplikacji, jednak ułatwiają zlokalizowanie zbędnych (np. nieużywanych) elementów programu. W zakładce Linker obydwie opcje zaczynające się od wyrazu Include wyłącz.

  5. W celu jeszcze skuteczniejszego wyszukiwania 'dziur' w programie wykorzystuj możliwości profiler'ów, np. ProDelphi, Sampling Profiler, DUnit lub AQTime.

  6. Rozmiar aplikacji pisanych w Delphi w dużej mierze jest uzależniony od niewydajnego VCL. Kiedy naprawdę zależy Tobie na zaoszczędzeniu jak najwięcej kilobajtów, to zastanów się nad pisaniem w WinAPI. Sporo informacji na temat uzywania WinAPI w Delphi można znaleźć na stronie DelphiZeus. Za trudne? Istnieje jeszcze KOL (wraz z MCK). Gotowe aplikacje napisane w KOL'u zajmują znacznie mniej miejsca niż ich odpowiedniki napisane w VCL. Dodatkowo MCK rozszerza możliwości KOL o programowanie obiektowe. Wadą jest ograniczona liczba gotowych komponentów, przez co w niektórych przypadkach albo trzeba napisać własne, albo zastosować inne (bardziej okrężne) rozwiązanie. Rozmiar końcowej aplikacji można dodatkowo zmniejszyć podmieniając standardowe biblioteki Delphi na biblioteki KOL (np. system.dcu) oraz podając dodatkowe parametry w polu Conditional defines np. SMALLEST_CODE (wszystkie parametry opisane są w pliku kol.pas). Pole to znajduje się w menu Projects, następnie Options i zakładka Directories/Conditionals.

  7. Jeśli już koniecznie musisz pisać aplikacje w VCL, staraj się zastępowac standardowe komponenty firmy Borland komponentami o podobnym działaniu, ale znacznie bardziej wydajnymi. Przykładowo, TRegistry można zastąpić za pomocą Minireg, natomiast osoby szukające szybkich funkcji na pewno zainteresują się projektem FastCode.

III. Pokaż się

Przed upublicznieniem swojego dzieła możesz znacząco zmniejszyć jego rozmiary za pomocą kompresji. W zależności od formy udostępnienia aplikacji stosuje się z jeden z poniższych sposobów: * z instalatorem: który zalecany jest przy bardziej zło¿onych projektach oraz większej ilości plików składających się na aplikację * bez instalatora: czyli z pojedynczym plikiem EXE który można w każdej chwili uruchomić, bez potrzeby instalacji
  1. W wersji z instalatorem zazwyczaj mamy do wyboru kilka metod kompresji, np. NSIS korzysta z szybkiego ZLIB, skutecznego LZMA oraz z kompresji BZIP2, która stanowi rozwiązanie pośrednie. Istnieje możliwość przetestowania każdego rozwiązania i wybrania najlepszego.

  2. Decydując się na pojedynczy plik możemy skorzystać z kompresora PE, najbardziej popularnym jest UPX . Nie wiedzieć czemu, w wielu poradnikach autorzy zalecają wcześniejsze użycie StripReloc - ponieważ UPX standardowo korzysta z parametru --strip-relocs=1, więc jakiekolwiek uruchamianie StripReloc wydaje się być totalnie bezcelowe. Najlepszy współczynnik kompresji uzyskasz z parametrem --ultra-brute. Pamiętaj jednak, aby przed opublikowaniem aplikacji przetestować ją pod kątem stabilności, gdyż w niektórych przypadkach kompresja UPX’em powoduje zawieszanie się programu. Główną wadą wszelkiego rodzaju kompresorów PE jest zwiększone zużycie pamięci przez skompresowaną aplikację, jako iż przy jej uruchomieniu następuje załadowanie całego programu i to bez względu na to czy użytkownik skorzysta z wszystkich opcji programu, czy też nie. Dodatkowo, jeśli zostanie uruchomiona więcej niż jedna kopia aplikacji, poszczególne fragmenty nie są współdzielone, co również w znaczny sposób zwiększy zużycie pamięci. Oczywiście wszystko kosztem mniejszego rozmiaru aplikacji na dysku twardym.

1 komentarz

Bardzo dobry art :)