objective-c - Swift 优化不起作用?

标签 objective-c swift optimization

我正在尝试为我的应用程序在 Swift 和 Objective-C 之间做出决定。目前,我正在测试应用程序中经常发生的操作的性能。

我编写了一个测试应用程序,它下载一个 json 文件并将其放入 NSDictionary 中,如下所示:

    var err: NSError
    var jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(JSONData, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary
    println(jsonResult)

当我测试它时,Objective-C 似乎每次都更快。但是使用优化(-Ounchecked)和不使用优化(-Onone)没有区别。我知道 println 是 Objective-C 和 Swift 中最大的减速。

缺乏优化与几乎不可能优化该行是否有任何关系?

最佳答案

正如你所说,上面的程序没有什么可以优化的。您可以通过查看程序集输出自行检查,但我希望它们几乎相同。

总的来说,与 Swift 相比,如今在 ObjC 中,大量涉及 Cocoa 的事​​情将变得一样快或更快。 ObjC 编译器背后有数十年的工作,而 Cocoa 有数十年的 ObjC 特定优化。 Swift 无法做任何事情来更快地调用现有的 Cocoa 方法。 NSJSONSerialization在 ObjC 和 Swift 中是同一个类。

在传统上使用 C 或 C++ 的事情上,Swift 有可能比纯 ObjC 更快。 [Int] 是可能的比 NSArray 更快的 NSNumber对于某些操作(但在您假设 NSArray 很慢之前,请参阅 this question),就像 vector<int> 可能的那样或 int[]对于相同的操作更快(并且出于大致相同的原因)。但这并不是选择 Swift 的理由。如果数值计算是您的主要问题,并且性能非常重要,那么 C 和 C++ 背后有数十年的优化。 Swift 可能会在某些地方击败它们,但 C 和 C++ 是众所周知的数量。

但是像这样的微基准测试对于解决性能问题毫无用处。他们不会告诉您太多有关应用程序总体性能的信息。这来自分析真实代码,然后优化您的瓶颈。在某些情况下,这可能意味着将一些 Swift 代码移到 ObjC(或 C 或 C++)中,就像我们长期以来在需要提高某些性能时将 ObjC 代码片段转换为 C 或 C++ 一样。

Swift 并不比 ObjC 更容易阅读和理解。在某些情况下它更容易编写(尽管通常更难)。由于打字更好,编写错误更少的正确代码要容易得多,这就是为什么我认为它会成为一种伟大的语言。但这并不是因为它“更容易”。

Swift 看起来更容易,因为它的语法稍微更接近 Java 和 JavaScript,许多评估它的人都有 Java 和 JavaScript 背景,但 Swift 在使用 Cocoa 时具有显着更复杂的功能和粗糙的边缘使理解变得更加困难。为什么需要 as NSDictionary在上面的代码中?一个新程序员应该怎么知道呢?等效的 ObjC 没有这种怪异之处。当您开始做更多的工作时,您会随时发现许多非常令人困惑的编译器错误AnyObject出现(并且它一直出现在 Cocoa 中)。不要被圆括号和方括号所迷惑。 ObjC 是一种简单得多的语言,提供了多年的教程、StackOverflow 问答、书籍和培训。 (此外,ObjC 编译器几乎从不崩溃。)

IMO,如果您不确定,请使用 ObjC。 ObjC 是 Cocoa 的设计目标。 ObjC 有一个完善的编译器。 ObjC 更容易学习(只是深入研究并开始研究事物更难,但实际学习更容易)。

随着 Swift 稳定下来(而且很快稳定下来),您可以将应用的部分内容转换为 Swift。 Swift 旨在允许您以这种方式混合它,并且在实践中这样做变得越来越容易(特别是使用新的 ObjC 注释)。但是,如果您有任何严重的截止日期,我强烈推荐 ObjC。

另一方面,如果您没有严格的截止日期,并且您更喜欢 Swift,那就去做吧。我认为有一天它会成为一种伟大的语言。

关于objective-c - Swift 优化不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28697895/

相关文章:

iphone - ARKit 是否公开了一种显示地平面的自动方式,还是应该将其作为对象添加到某些坐标

ios - 为什么我无法保存应用内购买?

mysql - 需要优化 TIMESTAMPDIFF 查询

iphone - avplayer内存泄漏

objective-c - NSEnumerator 内存泄漏

ios - 在 objc 中使用 swift 框架

iphone - iPhone 上 SQLite 中的临时表存储

ios - 具有右图像和居中文本的 UIButton

ios - EKEventeditViewController 在 iOS 13 上不会显示编辑按钮

Scala:编译器可以有效地优化常量吗?