2010-04-07 13 views
10

Wciąż słyszę, że aplikacje na Androida powinny próbować ograniczyć liczbę tworzonych obiektów, aby zmniejszyć obciążenie odszukiwacza. Ma to sens, że nie chcesz tworzyć ogromnej liczby obiektów do śledzenia na ograniczonym obszarze pamięci, na przykład na tradycyjnej aplikacji serwerowej utworzonej w ciągu kilku sekund 100 000 obiektów nie byłoby niespotykane.Zmiana stylu kodowania ze względu na wydajność GC Androida, jak daleko jest za daleko?

Problem w tym, jak daleko powinienem to wziąć? Widziałem mnóstwo przykładów aplikacji na Androida polegających na statycznym stanie, aby rzekomo "przyspieszyć". Czy zwiększenie liczby instancji wymagających zebrania śmieci z dziesiątek na setki naprawdę robi tak wielką różnicę? Mogę sobie wyobrazić zmianę mojego stylu kodowania tak, by teraz tworzył setki tysięcy obiektów, jakie możesz mieć na pełnowymiarowym serwerze Java-EE, ale poleganie na kilku statycznych stanach, aby (rzekomo) zmniejszyć liczbę obiektów do zbierania śmieci, wydaje się dziwny.

Ile naprawdę trzeba zmienić styl kodowania, aby tworzyć wydajne aplikacje na Androida?

Odpowiedz

10

Porada "unikaj przydziału" zazwyczaj dotyczy pętli gier. Maszyna wirtualna musi się zatrzymać, aby zebrać śmieci, a nie chcesz, aby tak się działo, gdy twoja gra będzie animowana z prędkością 30 klatek na sekundę. Jeśli nie przydzielisz żadnych obiektów, maszyna wirtualna nie będzie musiała zbierać śmieci w celu zwolnienia pamięci. Jeśli masz grę, która wymaga uruchomienia bez widocznych widocznych elementów, powinieneś rozważyć zmianę kodu w odpowiednich częściach, aby zminimalizować lub wyeliminować alokację.

Jeśli tworzysz aplikację zawierającą przepisy lub wyświetlające zdjęcia, nie martwię się o to - czkawka GC nie jest czymś, co użytkownik prawdopodobnie zauważy.

Przyszłe ulepszenia Dalvik GC (np. Gromadzenie pokoleń) powinny uczynić to mniejszym problemem.

+3

Dodam również, że często znajdziesz kod Java, który był oryginalny napisany dla komputerów stacjonarnych lub serwerów, który jest niezwykle nieefektywny i będzie przerzucał mnóstwo obiektów w porównaniu do ilości pracy, jaką wykonuje. Na przykład widziałem kod sieciowy, który nieustannie powoduje, że GCs przetwarza dane z sieci. Jeśli twój kod to robi, powinieneś naprawdę zoptymalizować go, nie tylko z powodu Dalvik, ale dlatego, że nie jest odpowiedni dla urządzenia mobilnego - wszystkie te dodatkowe prace pochodzą bezpośrednio z baterii. – hackbod

+1

Jeśli chodzi o to, jak bardzo styl powinien zostać zmieniony, powiedziałbym, że najlepszym sposobem na zrobienie tego jest napisanie kodu, który działa (i zastanowić się nad ponownym wykorzystaniem przydzielonych obiektów, ale nie jest to zbyt obszerne) i sprawdzić, czy istnieje jakikolwiek nacisk na GC. Jeśli tak jest, uruchom pamięć profilującą twój kod i znajdź miejsca, w których możesz uniknąć przydzielania i usuwania zmiennych. –

4

Powiedziałbym, że to naprawdę zależy od tego, co robisz i jaki jest twój styl kodowania. Zawsze należy pamiętać o ograniczeniach sprzętowych urządzenia mobilnego i odpowiednio do tego programu, ale dobrze jest wiedzieć, gdzie aplikacja będzie działać. Jeśli wykonujesz wiele naprawdę intensywnych obliczeń, które musisz zaktualizować w czasie rzeczywistym lub coś w stylu gry, możesz zajrzeć do NDK, ale jeśli robisz normalne rzeczy, nie powinno być tak źle . Moją radą byłoby spróbować oszczędzać, ale nie martwić się zbytnio o optymalizację, dopóki nie poczujesz, jak działa.

Powiązane problemy