Swift的优化

作者: Silicn | 来源:发表于2019-07-25 14:46 被阅读1次

    swift 比oc更快,但是swift编译比oc时间长
    因为swift使用Whole Module Optimizations优化机制

    swift值类型存储在栈中,引用类型存储在堆中。

    1、栈是线程独有的,因此不需要考虑线程安全问题。
    2、堆中的数据是多线程共享的,所以为了防止线程不安全,需同步锁来解决这个问题题

    Objective-C语言动态化(runtime)这种灵活性是以查表的方式找出函数地址,既然查表操作,当然要付出时间代价

    对象基于协议
    Existential Container
    协议类型:一般的Existential Container数据结构为:

    • 数组中每个元素的大小都是固定的 5 个 word,解决了数组元素下标快速定位的问题。
    • 因为有 Value Buffer 的存在,我们可以将不同大小的值类型存放到 Value Buffer 中,小于等于 3 个 word 的值直接存储,更大的则通过保存引用地址的方式存储。
    • 通过 Value Witness Table,我们可以找到这个值类型的相关生命周期的管理函数。
    • 通过 Protocol Witness Table,我们可以找到协议的具体实现函数的地址。

    编译优化

    Clang 编译器流程

    image.png

    swift 特有编译器流程

    image.png

    注释:AST: 抽象语法树

    • 预处理(Pre-process):他的主要工作就是将宏替换,删除注释展开头文件,生成.i文件。
    • 词法分析 (Lexical Analysis):将代码切成一个个 token,比如大小括号,等于号还有字符串等。是计算机科学中将字符序列转换为标记序列的过程。
    • 语法分析(Semantic Analysis):验证语法是否正确,然后将所有节点组成抽象语法树 AST 。由 Clang 中 Parser 和 Sema 配合完成
    • 静态分析(Static Analysis):使用它来表示用于分析源代码以便自动发现错误。
    • 中间代码生成(Code Generation):开始IR中间代码的生成了,CodeGen 会负责将语法树自顶向下遍历逐步翻译成 LLVM IR,IR 是编译过程的前端的输出后端的输入。
    • 优化(Optimize):LLVM 会去做些优化工作,在 Xcode 的编译设置里也可以设置优化级别-01,-03,-0s,还可以写些自己的 Pass,官方有比较完整的 Pass 教程: Writing an LLVM Pass — LLVM 5 documentation 。如果开启了 bitcode 苹果会做进一步的优化,有新的后端架构还是可以用这份优化过的 bitcode 去生成。
    • 生成目标文件(Assemble):生成Target相关Object(Mach-o)
    • 链接(Link):生成 Executable 可执行文件

    Swift可以通过关键字dynamic对方法进行标记,这样就会告诉编译器,此方法使用的是OC的运行时机制。
    注意:我们常见的关键字@ObjC并不会改变Swift原有的方法分派机制,关键字@ObjC的作用只是告诉编译器,该段代码对于OC可见。

    Class extension使用的是Static dispatch

    相关文章

      网友评论

        本文标题:Swift的优化

        本文链接:https://www.haomeiwen.com/subject/hnfslctx.html