CoreFoundation vs Foundation - PullRequest
       27

CoreFoundation vs Foundation

25 голосов
/ 23 сентября 2010

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

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

Ответы [ 2 ]

34 голосов
/ 23 сентября 2010

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

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

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

И вот где Foundation становится быстрее: Ваше время.

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

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

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

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

3 голосов
/ 11 декабря 2014

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

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

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

...