在 iPhone 开发中,速度至关重要。有谁知道使用 CoreFoundation 类型(如 CFMutableDictionaryRef)与 Foundation 类型(其对应物,NSMutableDictionary)之间是否存在速度差异。
我认为操作 CF 类型会更快,因为它不必抛出 ObjC 运行时消息,这是一个没有根据的假设,有没有人真正研究过这个?
在 iPhone 开发中,速度至关重要。有谁知道使用 CoreFoundation 类型(如 CFMutableDictionaryRef)与 Foundation 类型(其对应物,NSMutableDictionary)之间是否存在速度差异。
我认为操作 CF 类型会更快,因为它不必抛出 ObjC 运行时消息,这是一个没有根据的假设,有没有人真正研究过这个?
从技术意义上讲,是的,正是因为这个原因,它更快。
在实际意义上,不,它并没有更快。一方面,速度差异很小。我们说的是在整个过程的生命周期中节省的毫秒数。
iPhone 上的节省可能更大,但它仍然是您可以获得的最小速度提升。你最好花时间在 Instruments 中分析你的应用程序,然后去它告诉你的地方,并消除你自己代码中的热点。
这就是 Foundation 变得更快的地方:您的时间。
在可行的情况下使用 Foundation 的自动释放功能的代码可以避免容易避免的内存泄漏(即忘记写入或无法到达release
消息),从而为您节省大量时间和麻烦。CF 没有自动释放功能,因此您必须记住明确CFRelease
使用它创建或复制的所有内容——当您忘记或无法访问该代码时(我的意思是当——我根据经验说话),您将花费更多时间寻找内存泄漏。静态分析器有帮助,但它永远无法捕获所有内容。
(从技术上讲,您可以自动释放 CF 对象,但是这样做的代码非常难看,而且您只会降低您已经微不足道的速度增益。)
所以,尽可能地坚持Foundation。不要过度使用自动释放;即使在纯 Cocoa 中,有时仍需要显式释放对象(主要是紧密循环),这对于 Cocoa Touch 来说是双倍的(因为如果分配太多内存,iOS 会杀死你的应用程序,所以你会想要释放大尽快像图像这样的对象)。但通常情况下,自动释放为您节省的时间远远多于 CF 为您的用户节省的时间。
与时间无关的原因是,参数名称(来自消息选择器)与值混合在一起的 Objective-C 代码比基于 C 函数的代码更容易阅读。这可能不会让你的工作变得更快,但它肯定会让它变得更有趣。
在 CF 函数中编写代码确实可以为您的应用程序带来性能提升,但是如果您真的想要最终的性能提升,您可以直接用机器代码编写代码,没有比这更快的了。虽然这将是一种极端的方法。
至少出于 Peter Hosey 提到的原因,高级语言结构比低级语言结构更可取。为此,我们可以添加过早的优化,这很容易导致项目失败,因为开发人员更关心应用程序的非功能方面而不是功能方面。
如果在您拥有一个功能齐全的应用程序之后,您觉得代码的某些部分存在性能瓶颈,您可以尝试通过将它们重写为低级语言结构来优化它们。您至少要与当前代码有一个比较点,以确保低级代码的行为符合预期(手动或单元测试都可以做到这一点)。
我想说的是,虽然我们不应该忽视性能,但我们不应该把它作为我们的首要目标。功能方面同样重要(甚至更重要)。如果你没有一个应用程序可以提供它的功能规格,那么它可能是地球上最快的,人们仍然不会使用它。