迅速性能高效的原因有哪些

  介绍

这篇文章将为大家详细讲解有关迅速性能高效的原因有哪些,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

自2014年从苹果发布迅速语言以来,历时六年多,迅速已经发布到5.3版本,在5.0版本已经ABI稳定,5.2版本也已经模块稳定,不管是语言还是基础库都日趋稳定,目前国内外大厂也都积极拥抱迅速阵营。

绝大多数公司选择迅速语言开发iOS应用,主要原因是因为迅速相比Objc有更快的运行效率,更加安全的类型检测,更多现代语言的特性提升开发效率,这一系列的优点使迅速语言的热度越来越高。

大多数人知道迅速语言相比于Objc语言运行效率更高,但是却不知道为什么效率更高,在这里我们迅速编译层探讨一下迅速语言高效的原因。

在开始讨论迅速数据类型之前,我们先讨论一下迅速的函数派发机制;

静态派发,动态派发,消息派发(静态调度,动态调度,消息调度)
动态派发(动态调度):动态派发是指编译期无法确定应该调用哪个方法,需要在运行时才能确定方法的调用。

静态派发(静态调度):是在编译期就能确定的调用方法的派发方式。

除了上面两种方式之外,在迅速里面还会使用Objc的消息派发(消息调度)机制;Objc采用了运行时采用obj_msgsend进行消息派发,所以Objc的一些动态特性在斯威夫特里面也可以被限制的使用。

静态派发相比于动态派发更快,而且静态派发还会进行内联等一些优化,减少函数的寻址及内存地址的偏移计算等一系列操作,使函数的执行速度更快,性能更高。

<强>数据类型(结构/类)

我们都知道,内存分配可以分为堆区(堆)和栈区(栈)。由于栈区内存是连续的,内存的分配和销毁是通过入栈和出栈操作进行的,速度要高于堆区。堆区存储高级数据类型,在数据初始化时,查找没有使用的内存,销毁时再从内存中清除,所以堆区的数据存储不一定是连续的。

类(类)和结构体(结构)在内存分配上是不同的,基本数据类型和结构体默认分配在栈区,而像类这种高级数据类型存储在堆区,且堆区数据存储不是线程安全的,在频繁的数据读写操作时,要进行加锁操作。

我们在斯威夫特文档里面能看到对结构的描述,结构体是值类型(值类型),当值类型的数据赋值给一个变量或常量,或者传递给一个函数时,是值拷贝;

例如:

 struct决议{
  var宽度=0
  var高度=0
  }
  
  让高清=决议(宽度:1920,身高:1080)
  var=高清电影
  电影院。宽度=2048
  
  打印(“电影现在\ (cinema.width)像素wide")//打印“电影现在是2048像素wide"
  
  打印(“高清仍\ (hd.width)像素wide")//打印“高清仍然是1920像素wide" 

通过这个例子我们能清楚的看的到,当高清赋值给电影院时,是将hd中存储的值拷贝给电影院,所以当给电影的宽度属性赋值的时候,并不会改变hd中的属性值,如下图所示:

把杆傩阅芨咝У脑蛴心男?

结构体除了属性的存储更安全、效率更高之外,其函数的派发也更高效。由于结构体不能被继承,也就是结构体的类型被最终修饰,根据我们对于动态派发及静态派发的描述,那么其内部函数应该是属于静态派发,在编译期就确定了函数的执行方式,其函数的调用通过内联(内联)的方式进行优化,其内存连续,减少了函数的寻址及内存地址的偏移计算,其运行相比于动态派发更加高效。

<强>协议类型(协议类型)

多态是面向对象的一大特性,在结构体中不能通过继承或者引用语言的多态,迅速就引入了协议(协议),通过协议来实现了结构体的多态特性,这也是斯威夫特面向协议编程的核心所在。

对于类(类)来说,每个类都会创建一个虚拟函数表指针,这个指针则指向一个v-table表,也就是虚函数表,表内存储着该类的函数指针数组,拥有继承关系的子类会在虚函数表内通过继承顺序(C + +可以实现多继承)去展示虚函数表指针。类里面方法的派发则是根据v-table表里面函数指针来进行派发。

而结构体(结构)没有继承,也就是说结构体并没有v-table表用于函数的派发。为了实现这一特性,在结构体的协议(协议)的实现里添加了协议见证表用于管理协议类型的方法派发。

上面介绍了一些迅速在数据结构上的一些优化,除了数据结构优化之外,迅速在编译过程也进行了大量的优化,其中最核心的优化,是在编译过程中引入SIL。

迅速性能高效的原因有哪些