CoreFoundation vs Foundation

В разработке iPhone скорость - это главное. Кто-нибудь знает, есть ли разница в скорости между использованием типа CoreFoundation (например, CFMutableDictionaryRef) и типа Foundation (его аналог, NSMutableDictionary).

Я бы подумал, что манипулирование типом CF будет быстрее, так как ему не нужно разбрасывать сообщения времени выполнения ObjC, это необоснованное предположение, кто-нибудь на самом деле смотрел на это?

Ответ 1

В техническом смысле, да, это быстрее, именно по этой причине.

В практическом смысле, нет, это не быстрее. Во-первых, разница в скорости крошечная. Мы говорим о миллисекундах, сохраненных в течение всего процесса.

Экономия может быть больше на iPhone, но она по-прежнему в значительной степени крошечная скорость, которую вы можете получить. Ваше время намного лучше потрачено на профилирование вашего приложения в "Инструменты" и переход туда, где он говорит вам, и гладить горячие точки в вашем собственном коде.

И что там, где Фонд становится быстрее: ваше время.

Код, который использует функцию автоопределения Foundation, когда это возможно, экономит много времени и головных болей, избегая легко предотвращаемых утечек памяти (а именно, забывая писать или не доходить до сообщений release). CF не имеет авторекламы, поэтому вы должны помнить явно CFRelease все, что вы создаете или копируете с ним, - и когда вы забудете или не достигнете этого кода (и я имею в виду, когда-я говорю по опыту), вы будете тратить гораздо больше времени на поиск утечки памяти. Статический анализатор помогает, но он никогда не сможет поймать все.

(Вы технически можете автообновлять объекты CF, но код для этого ужасно уродливый, и вы только опускаете свое уже минимальное увеличение скорости.)

Итак, придерживайтесь Foundation как можно больше. Не заходите за борт с авторефератом; даже в чистом Cocoa, еще есть моменты, когда явно освобождаются объекты (в основном, жесткие петли), и это удваивается для Cocoa Touch (поскольку iOS убьет ваше приложение, если вы выделите слишком много памяти, так что вы будете хотите как можно скорее выпустить большие объекты, такие как изображения). Но, как правило, автозапуск экономит вам гораздо больше времени, чем CF никогда не будет сохранять ваших пользователей.

Не связанная с временем причина состоит в том, что код Objective-C, с именами аргументов (из селектора сообщений), смешанными со значениями, намного легче читать, чем код на основе функций C. Это может не сделать вашу работу идти быстрее, но это, безусловно, делает ее более увлекательной.

Ответ 2

Написание кода в функциях CF действительно приведет к повышению производительности вашего приложения, однако есть еще один лучший подход к повышению производительности: запись непосредственно в сборку принесет еще больший выигрыш в производительности (хотя это экстремальный подход).

Высокие языковые конструкции предпочтительны для низкоуровневых, по крайней мере, по причинам, упомянутым Петром Хосей. К этому мы можем добавить преждевременную оптимизацию, которая может легко привести к провалу проекта, поскольку разработчик больше интересуется нефункциональными аспектами приложения, а не функциональными.

Если после полнофункционального приложения вы чувствуете, что некоторые части кода имеют узкие места производительности, вы можете попытаться их оптимизировать, переписав их на низкоуровневые языковые конструкции. У вас будет, по крайней мере, точка сравнения с текущим кодом, чтобы убедиться, что код низкого уровня ведет себя так, как ожидалось (например, ручные или юнит-тесты будут делать трюк).