Performance 许多if语句/开关情况的性能

Performance 许多if语句/开关情况的性能,performance,big-o,Performance,Big O,如果我有1000条简单的If语句或switch语句 例: 与搜索某个列表相比,创建无关紧要的if语句的性能会更快吗?我认为,因为每个if语句都必须经过测试,直到找到所需的输出(最坏的情况是O(n)),所以如果我在一个列表中搜索,它将具有相同的性能。这只是一个假设。我没有证据证明这一点。我很想知道这一点 您可以将这些内容潜在地放入到代理中,然后这些代理位于映射中,映射的键是您指定的输入 C#示例: //声明一个映射。输入(键)是一个字符,我们有一个函数返回 //基于该字符的整数。该函数可能执行更复

如果我有1000条简单的If语句或switch语句

例:


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

您可以将这些内容潜在地放入到代理中,然后这些代理位于映射中,映射的键是您指定的输入

C#示例:

//声明一个映射。输入(键)是一个字符,我们有一个函数返回
//基于该字符的整数。该函数可能执行更复杂的操作。
var map=newdictionary();
//添加一些:
map['a']=(c)=>{return 1;};
map['b']=(c)=>{return 2;};
map['c']=(c)=>{return 3;};
//等等。。。无限的。
现在我们有了这个映射,我们可以非常干净地基于输入返回一些东西

public int Test(char c)
{
    Func<char, int> func;
    if(map.TryGetValue(c, out func))
        return func(c);
    return 0;
}
public int测试(字符c)
{
Func Func;
if(映射TryGetValue(c,out func))
返回函数(c);
返回0;
}

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

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

例如,在C语言中,我希望像您所展示的那样,使用一个长的
switch
语句在引擎盖下使用一个查找表,避免与所有不同的值进行显式比较。这样,无论您有多少个案例,您的
切换
决策都需要相同的时间。编译器还可以硬编码二进制搜索以查找匹配的大小写。在评估长
else if()
梯形图时,通常不会执行这些优化

在任何情况下,我重复一遍,这取决于解释器/编译器:如果您的编译器优化了
else If()
ladders,但没有switch语句,那么它可以用
switch
语句做什么是完全不相关的。然而,对于主线语言,您应该能够期望所有结构都得到优化

除此之外,我建议在适用的情况下使用
switch
语句,它比等效的
else if()
梯形图为读者提供更多的语义信息

// 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;
}