Swift 优化不起作用?

Swift optimization not working?

我正在为我的应用程序在 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 中最大的减速。

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

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

一般来说,涉及 Cocoa 的事情在今天的 ObjC 中与 Swift 一样快或更快。 ObjC 编译器背后有数十年的工作,Cocoa 有数十年的 ObjC 特定优化。 Swift 无法更快地调用现有的 Cocoa 方法。 NSJSONSerialization 与 ObjC 中的 class 和 Swift.

相同

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

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

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

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

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

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

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