【问题标题】:CoreFoundation vs Foundation核心基金会与基金会
【发布时间】:2011-04-15 23:37:45
【问题描述】:

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

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

【问题讨论】:

  • 当您说速度至关重要时,您是指开发速度还是开发应用程序的速度?
  • 应用程序本身的速度。

标签: cocoa core-foundation foundation


【解决方案1】:

从技术上讲,是的,它更快,正是因为这个原因。

实际上,不,它并没有更快。一方面,速度差异很小。我们说的是在整个过程的生命周期中节省的毫秒数。

在 iPhone 上节省的成本可能更大,但它仍然是您可以获得的最小速度提升。您最好花时间在 Instruments 中分析您的应用程序,然后去它告诉您的地方并消除您自己代码中的热点。

这就是 Foundation 变得更快的地方:您的时间。

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

(从技术上讲,您可以自动释放 CF 对象,但这样做的代码非常丑陋,而且您只会降低您已经微不足道的速度增益。)

所以,尽可能坚持使用 Foundation。不要过度使用自动释放;即使在纯 Cocoa 中,有时仍需要显式释放对象(主要是紧密循环),这对于 Cocoa Touch 来说是双倍的(因为如果分配太多内存,iOS 会杀死你的应用程序,所以你会想要释放大尽快像图像这样的对象)。但通常情况下,自动发布为您节省的时间远远超过 CF 为您的用户节省的时间。

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

【讨论】:

  • 当我使用 CF 对象时,我总是使用一个 C++ 包装器,它的析构函数负责 CFRelease,并且它也有复制构造函数等做正确的事情。记住在创建 CF 对象后立即将其放入这样的包装器中并不比记住自动释放 Foundation 对象更难,至少对我而言。但我同意任何时间差异都可能很小,应该让分析器指导自己的优化工作。
  • 我希望将大量数据从自定义结构化文本格式转换为真正的对象以供 iPhone 使用。但是,我会将其标记为已回答。
  • @JWWalker:如果你要包装一个 CoreFoundation 对象,为什么不把它包装在 Objective-C 中呢?事实上,具有 CF 类似物的类通常只是 CF 类的包装器。 (例如,NSMutableDictionary 是一个类簇,它经常返回一个实际类为 NSCFDictionary 的对象,它基本上只是一个使用 CFDictionary 作为其后备存储的 ObjC 类。)
  • 在我的情况下,我的想法是,不要使用可可,避免到处乱扔消息以获得一些速度。
  • 多年后,但要意识到一件事:如今,大量的 CF 实际上是用 ObjC 编写的。通过使用 C API,您实际上可能会受到一点性能影响,而不是获得加速。
【解决方案2】:

在 CF 函数中编写代码确实可以为您的应用程序带来性能提升,但是如果您真的想要最终的性能提升,您可以直接用机器代码编写代码,没有比这更快的了。虽然这是一种极端的做法。

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

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

我想说的是,虽然我们不应该忽视性能,但我们不应该把它作为我们的首要目标。功能方面同样重要(甚至更重要)。如果您没有一个应用程序可以提供它的功能规格,那么它可能是地球上最快的,人们仍然不会使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-09
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 2017-05-07
    • 2019-01-10
    相关资源
    最近更新 更多