CoreFoundation与基金会

时间:2010-09-22 21:30:12

标签: cocoa core-foundation foundation

在iPhone开发中,速度至关重要。有没有人知道使用CoreFoundation类型(如CFMutableDictionaryRef)与Foundation类型(其对应的NSMutableDictionary)之间是否存在速度差异。

我认为操纵CF类型会更快,因为它不必抛出ObjC运行时消息,这是一个毫无根据的假设,有没有人真正看过这个?

2 个答案:

答案 0 :(得分:34)

从技术意义上讲,是的,它更快,正是出于这个原因。

实际上,不,它不会更快。首先,速度差异很小。我们说的是在整个过程的整个过程中保存的毫秒数。

iPhone上的节省可能更大,但它仍然是你可以获得的最微小的速度增益。您可以花时间在仪器中分析您的应用程序,并将其告诉您并在您自己的代码中解决热点问题。

这就是基金会变得更快的地方:你的时间。

在可行的情况下使用Foundation的自动释放功能的代码可以避免容易避免的内存泄漏(即忘记写入或无法访问release消息),从而为您节省大量时间和麻烦。 CF没有autorelease,所以你必须记住明确CFRelease你创建或复制的所有内容 - 当你忘记或无法达到该代码时(我的意思是何时 - 我从经验中说,你将花费更多的时间来寻找内存泄漏。静态分析器有所帮助,但永远无法捕捉到所有内容。

(你在技术上可以自动释放CF对象,但这样做的代码非常难看,而你只是在减少已经微不足道的速度增益。)

所以,尽可能坚持基金会。不要过分自动释放;即使在纯Cocoa中,仍然有时候明确释放对象是有保证的(大多数是紧密的循环),而且这对于Cocoa Touch来说是双倍的(因为如果分配太多内存,iOS会杀死你的应用程序,所以你要发布大的像图像一样的对象尽快)。但通常情况下,autorelease会比CF节省用户更多的时间。

与时间无关的原因是Objective-C代码与参数名称(来自消息选择器)与值混合,比基于C函数的代码更容易阅读。这可能不会让你的工作更快,但它肯定会让它更有趣。

答案 1 :(得分:3)

在CF函数中编写代码确实会为您的应用程序带来性能提升,但是有另一种更好的方法来提高性能:直接在汇编中编写会带来更多的性能优势(尽管这是一种极端的方法)

至少出于Peter Hosey所提到的原因,高级语言结构优于低级语言结构。为此,我们可以添加过早优化,这很容易导致项目失败,因为开发人员更关注应用程序的非功能方面而不是功能方面。

如果在拥有一个功能齐全的应用程序之后,您觉得代码的某些部分存在性能瓶颈,您可以尝试通过将它们重写为低级语言结构来优化它们。您至少要对当前代码进行比较,以确保低级代码的行为符合预期(手动或单元测试将在此处完成)。