哪个更快? 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 无法正确表达,因此使用 ϴ/Ω。

(但是,我不确定为了正确性而牺牲可读性是否是正确的选择。)