什么是Swift字符串到NSString的桥接开销?
我已经开始学斯威夫特了。我读到,当使用Cocoa类时,Swift字符串被桥接到NSString。此操作的开销是多少?来自 Swift自动在字符串类型和NSString类之间建立桥接 来自Swift来源->什么是Swift字符串到NSString的桥接开销?,string,swift,performance,bridge,String,Swift,Performance,Bridge,我已经开始学斯威夫特了。我读到,当使用Cocoa类时,Swift字符串被桥接到NSString。此操作的开销是多少?来自 Swift自动在字符串类型和NSString类之间建立桥接 来自Swift来源-> String作为NSString和一个String 源于Objective-C的可将其字符存储在 NSString。因为NSString的任意子类都可以 如果成为字符串,则无法保证表示或 这种情况下的效率。由于NSString是不可变的,因此 就像存储被某个副本共享一样:第一个是 任何一系列的
String
作为NSString
和一个String
源于Objective-C的可将其字符存储在
NSString
。因为NSString
的任意子类都可以
如果成为字符串
,则无法保证表示或
这种情况下的效率。由于NSString
是不可变的,因此
就像存储被某个副本共享一样:第一个是
任何一系列的变异操作都会导致元素被复制
进入唯一的连续存储,这可能需要花费O(N)
时间和时间
空格,其中N
是字符串表示的长度(或
如果基础的NSString
具有异常性能,则需要执行更多操作
特征)
这是我从那一段得出的结论。注意:NSString
是不可变的,我不确定NSMutableString如何工作,这可能取决于您的具体情况
NSString
桥接到String
本质上是一种自由操作;不需要转换。O(1)
使用UTF-16作为备份存储<代码>字符串使用UTF-16或ASCII,因此两个实例可以使用相同的内存NSString
字符串
结构进行变异,则需要从原始NSString
复制所有内存。O(N)
如果不同时修改String
的内存,则无法修改其备份内存。这就是为什么必须复制内存,以便NSString
具有自己的内存String
swift使用的支持源代码。字符串的数据没有复制,结构是否复制?字符串对象通常由两部分实现,一部分是动态分配的数组,另一部分是指向数组并封装它的结构/类。我知道前者不是复制品。是后者吗?字符串结构本身被复制是。它目前的大小为3个字,因此不是一个昂贵的副本:1个字表示开始,1个字表示长度,1个字表示缓冲区所有者。我认为(但已经验证)memcpy指令之上的唯一开销是处理缓冲区所有者的任何引用计数。16字节的memcpy(与我们这里的12字节相比,尽管它们的速度可能相同)需要0.7纳秒,Objectvie-C保留/释放需要23.3纳秒。您的里程数可能会有所不同,但tldr“难以置信地快”。资料来源: