Fundacja a Fundacja

W rozwoju iPhone ' a szybkość jest najważniejsza. Czy ktoś wie, czy istnieje różnica prędkości między używaniem typu CoreFoundation (jak CFMutableDictionaryRef) a typem Foundation (jego odpowiednikiem, NSMutableDictionary).

Myślę, że manipulowanie typem CF byłoby szybsze, bo nie musi rzucać wokół komunikatów objective runtime, czy jest to bezpodstawne założenie, czy ktoś w ogóle się temu przyglądał?

-James

Author: grmartin, 2010-09-23

2 answers

W sensie technicznym, tak, jest szybszy, właśnie z tego powodu.

W sensie praktycznym, nie, to nie jest szybsze. Po pierwsze, różnica prędkości jest mała . Mówimy o milisekundach uratowanych przez cały proces.

Oszczędności mogą być większe na iPhonie, ale nadal jest to prawie najmniejszy przyrost prędkości, jaki możesz uzyskać. Twój czas jest znacznie lepiej spędzić profilowanie aplikacji w instrumentach i iść tam, gdzie ci mówi i Prasowanie hot spotów w Twój własny kod.

I tam Fundacja staje się szybsza: Twój czas.

Kod, który używa funkcji Autorelease Fundacji, gdy jest to możliwe, oszczędza dużo czasu i bólów głowy, unikając łatwych do uniknięcia wycieków pamięci (mianowicie zapominania o pisaniu lub nieosiągania wiadomości release). CF nie ma autorelease, więc musisz pamiętać, aby jawnie CFRelease wszystko, co tworzysz lub kopiujesz z nim-i kiedy zapomnisz lub nie dotrzesz do tego kodu (I mam na myśli Kiedy -mówię z doświadczenia), spędzisz znacznie więcej czasu na szukaniu wycieku pamięci. Analizator statyczny pomaga, ale nigdy nie będzie w stanie wszystkiego złapać.

(technicznie można autorelease obiektów CF, ale kod, aby to zrobić jest strasznie brzydki i jesteś tylko podlewanie swoje i tak już minuskułowy przyrost prędkości.)

Więc trzymaj się Fundacji tak bardzo, jak to możliwe. Nie przesadzaj z autorelease; nawet w czystym kakao, są jeszcze czasy, kiedy jawne zwalnianie obiektów jest uzasadnione (głównie ciasne pętle), a to idzie podwójnie w przypadku Cocoa Touch (ponieważ iOS zabije Twoją aplikację, jeśli przydzielisz zbyt dużo pamięci, więc będziesz chciał zwolnić duże obiekty, takie jak obrazy tak szybko, jak to możliwe). Ale zazwyczaj autorelease oszczędza znacznie więcej czasu niż CF kiedykolwiek uratuje użytkowników.

Powodem nie związanym z czasem jest to, że kod Objective-C, z nazwami argumentów (z selektora wiadomości) zmieszanymi z wartościami, jest znacznie łatwiejszy do odczytania niż kod oparty na funkcjach C kod. Może to nie sprawi, że Twoja praca pójdzie szybciej, ale na pewno sprawia, że jest bardziej zabawna.

 34
Author: Peter Hosey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-23 03:02:21

Pisanie kodu w funkcjach CF rzeczywiście zwiększy wydajność Twojej aplikacji, jednak istnieje inne lepsze podejście do poprawy wydajności: pisanie bezpośrednio w assembly przyniosłoby jeszcze więcej korzyści (choć jest to ekstremalne podejście).

Wysokopoziomowe konstrukcje językowe są lepsze od niskopoziomowych przynajmniej z powodów, o których wspomniał Peter Hosey. Do tego możemy dodać przedwczesną optymalizację, która może łatwo doprowadzić do niepowodzenia projektu, jak programista jest bardziej zainteresowany niefunkcjonalnymi aspektami aplikacji, a nie funkcjonalnymi.

Jeśli po uzyskaniu w pełni funkcjonalnej aplikacji czujesz, że niektóre części kodu mają wąskie gardła wydajności, możesz spróbować je zoptymalizować, przepisując je do niskopoziomowych konstrukcji językowych. Będziesz miał przynajmniej punkt porównawczy z bieżącym kodem, aby upewnić się, że kod niskiego poziomu zachowuje się zgodnie z oczekiwaniami(testy ręczne lub jednostkowe tutaj załatwią sprawę).

 3
Author: Cristik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-11 13:50:42