许多if语句/ switch case的性能

时间:2014-01-09 10:15:45

标签: performance big-o

如果我有1000个简单的if语句或switch语句

例如:

if 'a':
  return 1
if 'b':
  return 2
if 'c':
  return 3
...
...

与搜索列表中的内容相比,创建普通if语句的性能会更快吗?我想,因为必须测试每个if语句,直到找到所需的输出(最坏情况为O(n)),如果我搜索列表,它将具有相同的性能。这只是一个假设。我没有证据证明这一点。我很想知道这一点。

2 个答案:

答案 0 :(得分:1)

您可以将这些内容放入当时位于地图中的委托中,其中的关键是您指定的输入。

C#示例:

// declare a map.  The input(key) is a char, and we have a function that will return an
// integer based on that char.  The function may do something more complicated.
var map = new Dictionary<char, Func<char, int>>();

// Add some:
map['a'] = (c) => { return 1; };
map['b'] = (c) => { return 2; };
map['c'] = (c) => { return 3; };
// etc... ad infinitum.

现在我们有了这张地图,我们可以根据输入

非常干净地返回一些内容
public int Test(char c)
{
    Func<char, int> func;
    if(map.TryGetValue(c, out func))
        return func(c);
    return 0;
}

在上面的代码中,我们可以调用Test,它将找到适当的函数来调用(如果存在)。这种方法比列表更好(imho),因为您必须搜索整个列表才能找到所需的输入。

答案 1 :(得分:1)

这取决于您使用的语言和编译器/解释器。在许多解释语言中,性能将是相同的,在其他语言中,switch语句为编译器提供了可以用于优化代码的重要附加信息。

例如,在C语言中,我期望一个很长的switch语句,就像你提出的语句一样,使用查找表,避免与所有不同的值进行显式比较。这样,无论您有多少案例,您的switch决定都需要同一时间。编译器也可能对匹配情况的二进制搜索进行硬编码。在评估长else if()阶梯时,通常不会执行这些优化。

在任何情况下,我再说一遍,这取决于解释器/编译器:如果您的编译器优化了else if()梯形图,但没有切换语句, 可以用{{1>做什么语句是无关紧要的。但是,对于主线语言,您应该能够期望所有构造都得到优化。

除此之外,我建议在适用的情况下使用switch语句,它向读者提供的语义信息比同等的switch阶梯更多。