哪个更快? switch 语句还是字典?
Which is faster? Switch statement or dictionary?
我在 Objective-c/C 中看到很多以下枚举到字符串的转换在起作用。像这样的东西:
static NSString *_TranslateMyAnimalToNSString(MyAnimal animal)
{
switch (animal) {
case MyAnimalDog:
return "my_animal_dog";
case MyAnimalCat:
return @"my_animal_cat";
case MyAnimalFish:
return @"my_animal_fish";
}
}
NS_ENUM(NSInteger, MyAnimal) {
MyAnimalDog,
MyAnimalCat,
MyAnimalFish,
};
拥有静态字典会不会更快and/or更小?类似于:
static NSDictionary *animalsAndNames = @{@{MyAnimalCat} : @"my_animal_cat",
@{MyAnimalDog} : @"my_animal_dog",
@{MyAnimalFish} : @"my_animal_fish"};
差异很小,但我正在尝试优化二进制大小和速度,这让我倾向于后者。
感谢您帮助澄清。
回答
对于大量案例,字典应该更快。字典是一个 hashmap,它允许 O(1)
查找。另一方面,switch 语句必须遍历所有条目,因此需要 ϴ(n)
时间。
大 O/ϴ/Ω 符号的快速解释
Big-O 表示法用于给出特定函数的渐近上界。也就是说,f(n) = O(g(n)) 意味着随着 n 趋于无穷大(达到常数),f(n) 不会比 g(n) 增长得更快。同样,大 Ω 表示下限。所以函数f(n)=n+3既在Ω(1)又在O(n^4),用处不大
那么大的ϴ表示严格的界限。如果 f(n) = O(g(n)) 且 f(n) = Ω(g(n)) 则 f(n) = ϴ(g(n)).
经常使用大 O 就足够了,因为将线性算法宣传为 O(n^3) 是没有意义的,即使它在技术上是正确的。然而,在上面的例子中,重点在于开关盒的相对缓慢,大 O 无法正确表达,因此使用 ϴ/Ω。
(但是,我不确定为了正确性而牺牲可读性是否是正确的选择。)
我在 Objective-c/C 中看到很多以下枚举到字符串的转换在起作用。像这样的东西:
static NSString *_TranslateMyAnimalToNSString(MyAnimal animal)
{
switch (animal) {
case MyAnimalDog:
return "my_animal_dog";
case MyAnimalCat:
return @"my_animal_cat";
case MyAnimalFish:
return @"my_animal_fish";
}
}
NS_ENUM(NSInteger, MyAnimal) {
MyAnimalDog,
MyAnimalCat,
MyAnimalFish,
};
拥有静态字典会不会更快and/or更小?类似于:
static NSDictionary *animalsAndNames = @{@{MyAnimalCat} : @"my_animal_cat",
@{MyAnimalDog} : @"my_animal_dog",
@{MyAnimalFish} : @"my_animal_fish"};
差异很小,但我正在尝试优化二进制大小和速度,这让我倾向于后者。
感谢您帮助澄清。
回答
对于大量案例,字典应该更快。字典是一个 hashmap,它允许 O(1)
查找。另一方面,switch 语句必须遍历所有条目,因此需要 ϴ(n)
时间。
大 O/ϴ/Ω 符号的快速解释
Big-O 表示法用于给出特定函数的渐近上界。也就是说,f(n) = O(g(n)) 意味着随着 n 趋于无穷大(达到常数),f(n) 不会比 g(n) 增长得更快。同样,大 Ω 表示下限。所以函数f(n)=n+3既在Ω(1)又在O(n^4),用处不大
那么大的ϴ表示严格的界限。如果 f(n) = O(g(n)) 且 f(n) = Ω(g(n)) 则 f(n) = ϴ(g(n)).
经常使用大 O 就足够了,因为将线性算法宣传为 O(n^3) 是没有意义的,即使它在技术上是正确的。然而,在上面的例子中,重点在于开关盒的相对缓慢,大 O 无法正确表达,因此使用 ϴ/Ω。
(但是,我不确定为了正确性而牺牲可读性是否是正确的选择。)