如果我有1000个简单的if语句或switch语句
例如:
if 'a':
return 1
if 'b':
return 2
if 'c':
return 3
...
...
与搜索列表中的内容相比,创建普通if语句的性能会更快吗?我想,因为必须测试每个if语句,直到找到所需的输出(最坏情况为O(n)),如果我搜索列表,它将具有相同的性能。这只是一个假设。我没有证据证明这一点。我很想知道这一点。
答案 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
阶梯更多。