如何才能编写高性能的Swift代码

长沙白癜风医院 http://pf.39.net/bdfyy/bdfyc/150505/4618893.html

文档中的一些技巧可以帮助提升您的Swift程序质量,使您的代码不容易出错且可读性更好。显式地标记最终类和类协议是两个显而易见的例子。然而文档中还有一些技巧是不符合规矩的,扭曲的,仅仅解决一些比编译器或语言的特殊的临时性需求。文档中的很多建议来自于多方面的权衡,例如:运行时、字节大小、代码可读性等等。

启用优化

第一个应该做的事情就是启用优化。Swift提供了三种不同的优化级别:

-Onon:这意味着正常的开发。它执行最小优化和保存所有调试信息。

-O:这意味着对于大多数生产代码。编译器执行积极地优化,可以大大改变提交代码的类型和数量。调试信息将被省略但还是会有损害的。

-Ounchckd:这是一个特殊的优化模式,它意味着特定的库或应用程序,这是以安全性来交换的。编译器将删除所有溢出检查以及一些隐式类型检查。这不是在通常情况下使用的,因为它可能会导致内存安全问题和整数溢出。如果你仔细审查你的代码,那么对整数溢出和类型转换来说是安全的。

在XcodUI中,可以修改的当前优化级别如下:

整个组件优化

默认情况下Swift单独编译每个文件。这使得Xcod可以非常快速的并行编译多个文件。然而,分开编译每个文件可以预防某些编译器优化。Swift也可以犹如它是一个文件一样编译整个程序,犹如就好像它是一个单一的编译单元一样优化这个程序。这个模式可以使用命令行flag-whol-modul-optimization来激活。在这种模式下编译的程序将最最有可能需要更长时间来编译,单可以运行得更快。

这个模式可以通过XCod构建设置中的“WholModulOptimization”来激活。

降低动态调度

Swift在默认情况下是一个类似Objctiv-C的非常动态的语言。与Objctiv-C不同的是,Swift给了程序员通过消除和减少这种特性来提供运行时性能的能力。本节提供几个可被用于这样的操作的语言结构的例子。

动态调度

类使用动态调度的方法和默认的属性访问。因此在下面的代码片段中,a.aProprty、a.doSomthing()和a.doSomthingEls()都将通过动态调度来调用:

classA{varaProprty:[Int]funcdoSomthing(){...}dynamicdoSomthingEls(){...}}

classB:A{ovrridvaraProprty{gt{...}st{...}}

ovrridfuncdoSomthing(){...}}

funcusingAnA(a:A){a.doSomthing()a.aProprty=...}

在Swift中,动态调度默认通过一个vtabl[1](虚函数表)间接调用。如果使用一个dynamic关键字来声明,Swift将会通过调用Objctiv-C通知来发送呼叫代替。这两种情况中,这种情况会比直接的函数调用较慢,因为它防止了对间接呼叫本身之外程序开销的许多编译器优化[2]。在性能关键的代码中,人们常常会想限制这种动态行为。

建议:当你知道声明不需要被重写时使用“final”。

final关键字是一个类、一个方法、或一个属性声明中的一个限制,使得这样的声明不得被重写。这意味着编译器可以呼叫直接的函数调用代替间接调用。例如下面的C.array1和D.array1将会被直接[3]访问。与之相反,D.array2将通过一个虚函数表访问:

finalclassC{//NodclarationsinclassCcanbovrriddn.vararray1:[Int]funcdoSomthing(){...}}

classD{finalvararray1[Int]//array1cannotbovrriddnbya


转载请注明:http://www.aierlanlan.com/rzfs/583.html