10

Ostatnio pracowałem nad aplikacją, która przetwarza dużą ilość danych bardzo często (~ 15 razy na minutę). W tym celu przydzieliłem dużą porcję pamięci, a następnie uwolniłem ją dla każdej partii danych.Czy Spiky Memory "Zdrowe" dla aplikacji?

Oto ekran moich alokacji pamięci z instrumentami: The memory

Wykorzystanie Pamięć waha się od około 3 MB do około 30MB dość szybko. Zastanawiam się, czy jest to "zdrowy" dla iPhone'a.

Czy ryzykowne jest tak szybkie przydzielanie i uwalnianie tak dużej ilości pamięci? Czy to nietrwałe, czy po prostu zła praktyka?

Dzięki!

+0

Ciekawe, jakie przetwarzanie powoduje skok? Czy to przetwarzanie obrazu? –

+0

Tak, właściwie to analiza obrazu, skąd wiedziałeś? – pop850

Odpowiedz

7

To nie jest ani ryzykowna, ani koniecznie zła praktyka. Przydzielanie i zwalnianie pamięci wymaga czasu, więc robienie tego bardzo często, a nie robienie tego tylko raz i ponowne wykorzystanie przydzielonej pamięci jest kompromisem między efektywnością wykorzystania pamięci (przy użyciu najmniejszej ilości pamięci w każdym momencie) a wydajnością.

Jeśli wydajność Twojej aplikacji nie ucierpiała w tym momencie, prawdopodobnie dokonałeś prawidłowego wyboru w odniesieniu do tej kompromisu w swojej aplikacji.

Ogólnie mówiąc, użycie 30 MB pamięci jest dość duże dla starszych urządzeń (iPhone 3G i starszych). Nie możesz mieć pewności, że Twoja aplikacja ma tak dużo dostępnej pamięci, więc przygotuj się na otrzymywanie ostrzeżeń o pamięci. Jeśli aplikacja nie może zmniejszyć zużycia pamięci po otrzymaniu ostrzeżenia o pamięci, system operacyjny może ją zabić.

+0

Z mojego doświadczenia wynika, że ​​wszystko powyżej 20-25 MB spowoduje, że aplikacja zostanie zabita na telefonie iPhone 3G. pop850, powinieneś przetestować to na starszych urządzeniach (jeśli jesteś zainteresowany ich obsługą). W związku z tym, jeśli twoja aplikacja nie zostanie zabita wraz z pierwszym skokiem, robienie tego wielokrotnie prawdopodobnie również jej nie zabije. Dopóki nie ma wycieków. –

+0

Myślę, że będę musiał wykonać przetwarzanie w porcjach, więc używam mniej pamięci, ponieważ nie chcę ograniczać moich odbiorców do nowszych urządzeń. Wydaje mi się to jednak trochę kiepskie, ponieważ przeznaczyłem ponad 180 MB wcześniej bez awarii mojego iPhone'a 4. Wielkie dzięki za odpowiedź. – pop850

-1

To zależy od tego, czy użytkownik ma iPhone'a 4 czy iPhone'a 3GS, powinien być gotowy do pracy, ale w telefonie iPhone 3G bardzo szybko wyświetli ostrzeżenie o pamięci. iPhone 4 ma 256 MB pamięci RAM dla aplikacji (łącznie 512 MB) iPhone 3GS ma 128 MB dla aplikacji, a 256 łącznie iPhone 3g ma tylko 128 MB i 64 MB dla aplikacji .. zazwyczaj ma około 40 MB wolnego, gdy nie ma aplikacje są uruchomione.

jak Apple mówi, należy przydzielić tylko pamięć, czego naprawdę potrzebujesz, i starają się nie używać autorelease zbyt wiele, ponieważ daje nam autorelease obiektu przeznaczono natomiast my naprawdę nie trzeba go już

Jeśli wydajność nie jest tak źle, chciałbym spróbować użyć mniej pamięci i przydzielać więcej, gdy naprawdę tego potrzebujesz.

+0

Powinieneś w rzeczywistości używać puli autorelease z obiektami autorelease i używać ich w razie potrzeby. – koo

+0

@Adam Ko, ale powinieneś użyć wydania, w większości przypadków możesz samemu się liczyć i nie będziesz musiał sam robić basenu. O ile nie robisz osmething w pętli, która używa wielu autoreleased obiektów, które dostajesz przez API –

+0

Tak, nie jestem pewien co masz na myśli. Zachowanie opisane w pytaniu nie spowoduje ostrzeżenia o pamięci, chyba że przeznaczasz ogromne ilości pamięci.Poza tym tworzysz całkiem spore uogólnienia dotyczące ilości dostępnej pamięci, nie można powiedzieć, że "iPhone 4 ma 256 MB dla aplikacji (łącznie 512 MB)". Tak nie działa na sprzęcie. – lxt

4

Moim głównym zmartwieniem w takich sytuacjach byłaby fragmentacja. Jeśli porcje są tego samego rozmiaru, powinieneś być w porządku (patrząc na wykres, szczyty wydają się być całkowicie równe, więc myślę, że tak właśnie jest).

Będziesz płacić koszty alokacji, ale jak mówi Ole, jeśli twoja aplikacja działa już wystarczająco dobrze, nie ma sensu próbować jej optymalizować.