2009-11-28 17 views
5

Co jest grane z wbudowanymi funkcjami lub procedurami w Delphi (konkretnie v2010 tutaj, ale miałem ten sam problem z Turbo Delphi)?Delphi 2010 inlining bezużyteczne?

Jest trochę discalimeru w pomocy, ponieważ nie zawsze może wstawiać funkcję z powodu "pewnych kryteriów" cokolwiek to znaczy.

Ale odkryłem, że ogólnie funkcje inline (nawet bardzo proste, które mają 3 lub 4 linie kodu) spowalniają kod, a nie przyspieszają go.

Doskonałym pomysłem jest opcja kompilatora do "wstawiania wszystkiego". Nie obchodzi mnie, że mój exe powiększy się o 50% lub więcej, aby działało szybciej.

Czy istnieje sposób, w jaki mogę zmusić Delphi do rzeczywistego wstawiania kodu, nawet jeśli nie zdecydowano się na włączenie kompilatora? To by naprawdę pomogło. W przeciwnym razie musisz wykonać "ręczne wpisywanie", aby replikować kod procedury w wielu obszarach kodu z uwagami typu "// nie powiodło się tutaj wstawianie", więc jeśli zmienisz następne 5 linii, zmień je w 8 pozostałych duplikatach tego kodu "

Wszelkie wskazówki tutaj?

Odpowiedz

11

Istnieje opcja kompilatora do automatycznego wstawiania krótkich podpowiedzi. W Opcjach projektu, w Kompilatorze Delphi -> Kompilowanie -> Generowanie kodu, włącz "Kontrola wprowadzania kodu" na Auto. Należy jednak pamiętać, że powinno to dotyczyć wyłącznie wersji Release, ponieważ kodowanie wbudowane jest trudne do debugowania.

Powiedziałeś również, że nie masz nic przeciwko temu, aby program był większy, o ile robi się szybciej, ale to często powoduje, że jest wolniejszy. Powinieneś wiedzieć, że to może być powiązane. Im większy jest twój skompilowany kod, tym więcej pamięci podręcznej instrukcji będzie brakowało, co spowalnia wykonywanie.

Jeśli naprawdę chcesz przyspieszyć swój program, przeprowadź go przez profiler. Polecam Sampling Profiler, który jest darmowy, jest przeznaczony do pracy z kodem Delphi (w tym 2010) i nie spowalnia wykonywania. Pokaże ci szczegółowy raport o tym, jaki kod wydajesz najwięcej czasu. Gdy już to zauważysz, możesz skupić się na wąskich gardłach i spróbować je zoptymalizować.

+1

Kod ustawiający zestaw sterujący na auto nie pomógł. Sampling Profiler jest świetny. Bardzo pomocny w pokazaniu, gdzie wąskie gardła są w rzeczywistych statystykach. Nawet jeśli to naprawdę pokazało mi to, co już zrobiłem. Na pewno przyda się w przyszłości. Dzięki. – TallGuy

3

Podkładanie może w niektórych przypadkach powodować spowolnienie. Funkcja inlined może zwiększyć liczbę rejestrów CPU wymaganych dla zmiennych lokalnych. Jeśli nie ma wystarczającej ilości rejestrów, dostępne zmienne zostaną umieszczone w pamięci, co spowolni działanie.

Jeśli funkcja nie jest wstawiona, będzie miała (prawie) wszystkie rejestry CPU dostępne.

Odkryłem, że nie jest dobrym pomysłem wstawianie funkcji zawierających pętle. Będą używać kilku zmiennych, które prawdopodobnie znajdą się w pamięci, co spowolni wprowadzony kod.

+2

Zwiększenie liczby bajtów wymaganych do uruchomienia określonego algorytmu, spowoduje także zwiększenie pamięci podręcznej procesora. W rzadkich przypadkach może to również mieć wpływ. –

+3

Lars +1 - poza tym, że nie jest to rzadkie. –

1

Jeśli chcesz wymusić wpisanie, użyj plików włączania. Musisz upewnić się, że zadeklarowano poprawne zmienne, a następnie użyć {$ I filename.inc}. To zawsze spowoduje wstawienie tego konkretnego kodu dokładnie tam, gdzie chcesz, i ułatwi utrzymanie, jeśli chcesz go zmienić.

Należy pamiętać, że kompilator został napisany przez ludzi mądrzejszych niż większość zwykłych śmiertelników (włącznie ze mną) i ma dostęp do większej ilości informacji, gdy decyduje się na wstawienie lub nie, więc jeśli nie wstawia, prawdopodobnie ma dobry powód .

0

Jeśli zrozumiałem jeden z devels kompilatora FPC (który ma ten sam problem) poprawnie, inline może się zdarzyć tylko wtedy, gdy rutyna do inline została już skompilowana.

IOW, jeśli sprawisz, że urządzenie z funkcjami do wyboru będzie jednostką "liścia" i umieści je jako pierwsze w klauzuli uses Twojego projektu (.dpr), powinno być w porządku. Zauważ, że z jednostką "liścia" rozumiem jednostkę, która nie ma zależności od innych jednostek w projekcie, i tylko na już skompilowanych jednostkach.

Nie byłbym zaskoczony, że tak samo było w Delphi, ponieważ dzieli system jednostek oparty na tych samych zasadach.

Jest również niezniszczalna bez naruszania odrębnych zasad kompilacji.