Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么是Swift字符串到NSString的桥接开销?_String_Swift_Performance_Bridge - Fatal编程技术网

什么是Swift字符串到NSString的桥接开销?

什么是Swift字符串到NSString的桥接开销?,string,swift,performance,bridge,String,Swift,Performance,Bridge,我已经开始学斯威夫特了。我读到,当使用Cocoa类时,Swift字符串被桥接到NSString。此操作的开销是多少?来自 Swift自动在字符串类型和NSString类之间建立桥接 来自Swift来源-> String作为NSString和一个String 源于Objective-C的可将其字符存储在 NSString。因为NSString的任意子类都可以 如果成为字符串,则无法保证表示或 这种情况下的效率。由于NSString是不可变的,因此 就像存储被某个副本共享一样:第一个是 任何一系列的

我已经开始学斯威夫特了。我读到,当使用Cocoa类时,Swift字符串被桥接到NSString。此操作的开销是多少?

来自

Swift自动在字符串类型和NSString类之间建立桥接

来自Swift来源->

String
作为
NSString
和一个
String
源于Objective-C的可将其字符存储在
NSString
。因为
NSString
的任意子类都可以 如果成为
字符串
,则无法保证表示或 这种情况下的效率。由于
NSString
是不可变的,因此 就像存储被某个副本共享一样:第一个是 任何一系列的变异操作都会导致元素被复制 进入唯一的连续存储,这可能需要花费
O(N)
时间和时间 空格,其中
N
是字符串表示的长度(或 如果基础的
NSString
具有异常性能,则需要执行更多操作 特征)

这是我从那一段得出的结论。注意:
NSString
是不可变的,我不确定NSMutableString如何工作,这可能取决于您的具体情况

  • NSString
    桥接到
    String
    本质上是一种自由操作;不需要转换。O(1)
    • NSString
      使用UTF-16作为备份存储<代码>字符串使用UTF-16或ASCII,因此两个实例可以使用相同的内存
  • 但是,如果随后对该
    字符串
    结构进行变异,则需要从原始
    NSString
    复制所有内存。O(N)
    • String
      如果不同时修改
      NSString
      的内存,则无法修改其备份内存。这就是为什么必须复制内存,以便
      String
      具有自己的内存

  • swift使用的支持源代码。

    字符串的数据没有复制,结构是否复制?字符串对象通常由两部分实现,一部分是动态分配的数组,另一部分是指向数组并封装它的结构/类。我知道前者不是复制品。是后者吗?字符串结构本身被复制是。它目前的大小为3个字,因此不是一个昂贵的副本:1个字表示开始,1个字表示长度,1个字表示缓冲区所有者。我认为(但已经验证)memcpy指令之上的唯一开销是处理缓冲区所有者的任何引用计数。16字节的memcpy(与我们这里的12字节相比,尽管它们的速度可能相同)需要0.7纳秒,Objectvie-C保留/释放需要23.3纳秒。您的里程数可能会有所不同,但tldr“难以置信地快”。资料来源: