Eph*_*era 9 enums time-complexity swift
我在Swift中有很多支持的枚举Strings.考虑到枚举代表的内容,这是有道理的,并且考虑到以下代码块永远不必写入,这是实用的:
public enum MyEnum : String {
...
func stringValue() -> String {
switch self {
...
}
}
// I can just use .rawValue() instead.
}
Run Code Online (Sandbox Code Playgroud)
我无法找到的东西是关于非Integral类型支持的Enums的内部工作和性能的大量信息.具体来说,我正在寻找以下问题的答案:
String散列或Enums得到它们自己的==运算符,无论基础类型("真O(1)")如何,它都可以在其可能的值上运行?Enum(rawValue:)积分和非整数类型的构造函数的复杂性是多少?Kam*_*xom 13
看看这段代码:
enum A {
case A1, A2
}
enum B : Int {
case B1 = 1
case B2
}
enum C : String {
case C1
case C2
}
A.A1.hashValue // 0
A.A2.hashValue // 1
B.B1.hashValue // 0
B.B2.hashValue // 1
C.C1.hashValue // 0
C.C2.hashValue // 1
Run Code Online (Sandbox Code Playgroud)
正如你所看到的hashValue,任何枚举都等于案件的数量,无论rawValue是否有甚至是一个.这当然是因为在下面,每个枚举只是一个数字而且rawValue只是一个数组,它将这些数字(索引)映射到相应的值.因此
枚举比较总是只是两个数字之间的比较,你可以比较hashValues - > O(1)复杂度(未经测试,但我很确定)
我不知道如何使用原始值进行初始化,很可能是O(1)虽然(错误,它是O(n)!,请参见下面的编辑),因为所有可能的RawValue类型都是Hashable,因此可以将它们存储在一个Hashmap,意味着O(1)索引.
也就是说,枚举可以像这样实现:
enum M : RawRepresentable {
case M1 // rawValue = 4, hashValue = 0
case M2 // rawValue = 7, hashValue = 1
typealias RawValue = Int
// Int is Hashable -> Store in Dictionary -> O(1)
static let rawToEnum : [RawValue : M] = [
4 : .M1,
7 : .M2
]
// hashValue is index of this array
static let hashToRaw : [RawValue] = [
4,
7
]
var rawValue : RawValue {
return M.hashToRaw[hashValue]
}
init?(rawValue: RawValue) {
if let m = M.rawToEnum[rawValue] {
self = m
} else {
self = .M1 // Failed, assign a value to let it compile
return nil
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:似乎初始化枚举是O(n)(其中n是案例数)复杂性!
我做了一些性能测试,在那里我创建了4个不同的枚举,每个枚举128,256,512,1024个案例.然后我让程序选择每个枚举的128个随机rawValues,制作它们的数组并重复该数组20次(以获得更准确的时间).然后使用每个rawValues初始化枚举.以下是结果(发布版本):
Default rawValue: 20 repetitions
128 cases -> 0.003 sec (33% StDev)
256 cases -> 0.006 sec (14% StDev)
512 cases -> 0.014 sec (15% StDev)
1024 cases -> 0.025 sec (10% StDev)
Run Code Online (Sandbox Code Playgroud)
你可以查看我在这里创建的测试项目(XCode 7 beta 6)
另一个编辑:我在测试项目中添加了枚举,这符合RawRepresentable我上面显示的方式,再次使用完全相同的设置,128,256,512和1024个案例.结果(如预期的那样)是O(1)!所以显然创建自己的枚举更快!我只是不明白为什么Swift开发人员没有这样做......性能btw是RawRepresentable的自定义实现,重复200次(枚举初始化量是默认rawValues的10倍):
Custom rawValue: 200 repetitions
128 cases -> 0.008 sec ( 7% StDev)
256 cases -> 0.008 sec (15% StDev)
512 cases -> 0.010 sec (19% StDev)
1024 cases -> 0.008 sec (26% StDev)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
796 次 |
| 最近记录: |