内容简介:本小节通过性能消耗的Demo来从底层讲了协议底层先看demo明明是同一个Int为嘛后面的方法size就大很多。
本小节通过性能消耗的Demo来从底层讲了协议底层 容器 相关的知识点
先看demo
///使用泛型参数的方法--性能高
func f<C: CustomStringConvertible>(_ x: C) -> Int {
return MemoryLayout.size(ofValue: x)
}
///使用协议做参数的方法--性能低
func g(_ x: CustomStringConvertible) -> Int {
return MemoryLayout.size(ofValue: x)
}
f(5) // 8--正常一个Int类型在64位中Int的尺寸
g(5) // 40
复制代码
明明是同一个Int为嘛后面的方法size就大很多。
我们先看看g(5) 值为 40 是怎么组成的,这里面存在一个 不透明的容器 的概念(下图中标注的有)。
40的长度是由三部分组成
1.存储值的缓冲区(3个指针长度) 3 * 8 = 24
2.元数据 8
3.目击表(vtable 可以有0个或者多个 这里有1个) 8
来来,看看我大笔一挥画的灵魂示意图:
下面我们来说说什么是目击表?(只做了解即可)
目击表是让 动态派发 成为可能的关键,为一个特定的类型将 协议的实现 进行编码,表中会包含一个指向特定类型中的实现的 入口 。
知识点:如果我们合并多个协议,每多加一个协议,就会多 8 字节的数据块
OC中的协议不需要封装在存在容器中,so~
MemoryLayout.size // 8
性能调优
不推荐:negative_squared_cross_mark:
//隐式打包
func printProtocol(array: [CustomStringConvertible]) {
print(array)
}
复制代码
推荐:white_check_mark: swift标准库 中大多数使用场景。
//没有打包
func printGeneric<A: CustomStringConvertible>(array: [A]) {
print(array)
}
复制代码
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
模式识别
(希)Sergios Theodoridis、(希)Konstantinos Koutroumbas / 电子工业出版社 / 2010-2 / 75.00元
本书全面阐述了模式识别的基础理论、最新方法以及各种应用。模式识别是信息科学和人工智能的重要组成部分,主要应用领域有图像分析、光学字符识别、信道均衡、语言识别和音频分类等。本书在完美地结合当前的理论与实践的基础上,讨论了贝叶斯分类、贝叶斯网络、线性和非线性分类器设计、上下文相关分类、特征生成、特征选取技术、学习理论的基本概念以及聚类概念与算法。与前一版相比,增加了大数据集和高维数据相关的最新算法,这......一起来看看 《模式识别》 这本书的介绍吧!