3
我已經開始學習Swift了。我讀到,當使用Cocoa類時,Swift字符串被橋接到NSString。這個操作的開銷是多少?什麼是Swift字符串到NSString橋接開銷?
我已經開始學習Swift了。我讀到,當使用Cocoa類時,Swift字符串被橋接到NSString。這個操作的開銷是多少?什麼是Swift字符串到NSString橋接開銷?
夫特String類型和NSString類之間自動橋接。
從夫特源 - >stdlib/public/core/String.swift
String
橋接到目標C作爲NSString
和String
起源在Objective-C可在其字符存儲在NSString
。由於NSString
的任意子類可以變爲String
,所以在這種情況下不存在關於表示或效率的保證。由於NSString
是不可變的,它是 就好像該存儲被一些拷貝共享:第一是 突變操作的任何序列引起元件被複制 成唯一的,連續的存儲這可能花費O(N)
時間和 空間,其中N
是字符串表示的長度(或者 以上,如果基礎NSString
具有不尋常的性能 特性)。
這些是我從該段得出的結論。注意:NSString
是不可變的,我不確定NSMutableString是如何工作的,這取決於你的具體情況。
NSString
到String
本質上是一個自由操作;沒有轉換是必要的。 O(1)
NSString
使用UTF-16作爲其後備存儲。 String
使用UTF-16或ASCII,因此這兩個實例可以使用相同的內存。String
結構,所有的內存將需要從原始NSString
複製。 O(N)
String
無法修改後備存儲器,也不修改NSString
的存儲器。這就是爲什麼內存必須被複制的原因,因此String
擁有自己的內存。用於背襯StringCore即迅速用途的源代碼。
雖然字符串的數據不被複制,但結構是否被複制?字符串對象通常分兩部分實現,一個是動態分配的數組,另一個是指向數組並封裝的結構/類。我明白前者不會被複制。後者是? –
String結構本身被複製爲yes。它目前大小爲3個字,所以不是一個昂貴的副本:1個字開始,1個字長,1個字緩衝區所有者。我認爲(但已經驗證),memcpy指令之上的唯一開銷是與緩衝區所有者有關的任何引用計數。 – Kevin
一個16字節的memcpy(與我們在這裏的12個雖然它們可能是相同的速度)需要0.7納秒,ObjectVie-C保留/釋放需要23.3納秒。你的里程可能會有所不同,但tldr是「不可思議的快速」。資料來源:https://www.mikeash.com/pyblog/friday-qa-2016-04-15-performance-comparisons-of-common-operations-2016-edition.html – Kevin