Performance 当从if返回时,使用else if或仅使用if后是否有性能差异?

Performance 当从if返回时,使用else if或仅使用if后是否有性能差异?,performance,if-statement,Performance,If Statement,这不是我的问题,只是我的一个想法,我不知道 假设您希望检查多种可能性,例如: if(x > 1000) { return 1000; } if(x > 990) { return 1010; } if(x > 980) { return 33; } if(x > 970) { return 2; } if(x > 960) { return null; } 在这种情况下,我也可以使用elseif,而不只是输入一个新的if,它

这不是我的问题,只是我的一个想法,我不知道

假设您希望检查多种可能性,例如:

if(x > 1000)
{
    return 1000;
}
if(x > 990)
{
    return 1010;
}
if(x > 980)
{
    return 33;
}
if(x > 970)
{
    return 2;
}
if(x > 960)
{
    return null;
}

在这种情况下,我也可以使用elseif,而不只是输入一个新的if,它会产生完全相同的效果。是否存在性能差异?如果有,什么是更正确的方法呢?

通常没有。在正常情况下,If不在每条语句中返回If/else If/else更好,因为在此构造中,如果找到一个真实条件,可以停止查看reming If块


但在您的情况下,没有区别。

通常没有。在正常情况下,if不在每条语句中返回if/else if/else更好,因为在这种构造中,如果找到一个真实条件,您可以停止查看remaing if块


但是在您的情况下,没有什么不同。

我使用Stopwatch类运行了一些测试代码,似乎else ifs比多个ifs稍快一些。差别只是几滴水而已

private void button1_Click(object sender, EventArgs e)
{
Stopwatch sw = new Stopwatch();
        sw.Start();
        Bar(1337);
        sw.Stop();

        Console.WriteLine("Else ifs: " + sw.ElapsedTicks);

        sw.Reset();
        sw.Start();
        Foo(1337);
        sw.Stop();

        Console.WriteLine("Multiple Ifs: " + sw.ElapsedTicks);
}

private bool Foo(int x)
    {
        if (x > 1000000)
            return true;

        if (x > 100000)
            return true;

        if (x > 10000)
            return true;

        if (x > 1000)
            return true;

        if (x > 100)
            return true;

        if (x > 10)
            return true;

        if (x > 1)
            return true;

        return false;
    }

    private bool Bar(int x)
    {
        if (x > 1000000)
            return true;
        else if (x > 100000)
            return true;
        else if (x > 10000)
            return true;
        else if (x > 1000)
            return true;
        else if (x > 100)
            return true;
        else if (x > 10)
            return true;
        else if (x > 1)
            return true;
        else
            return false;
    }

注意:C.NET代码示例

我使用Stopwatch类运行了一些测试代码,似乎else ifs比多个ifs稍快。差别只是几滴水而已

private void button1_Click(object sender, EventArgs e)
{
Stopwatch sw = new Stopwatch();
        sw.Start();
        Bar(1337);
        sw.Stop();

        Console.WriteLine("Else ifs: " + sw.ElapsedTicks);

        sw.Reset();
        sw.Start();
        Foo(1337);
        sw.Stop();

        Console.WriteLine("Multiple Ifs: " + sw.ElapsedTicks);
}

private bool Foo(int x)
    {
        if (x > 1000000)
            return true;

        if (x > 100000)
            return true;

        if (x > 10000)
            return true;

        if (x > 1000)
            return true;

        if (x > 100)
            return true;

        if (x > 10)
            return true;

        if (x > 1)
            return true;

        return false;
    }

    private bool Bar(int x)
    {
        if (x > 1000000)
            return true;
        else if (x > 100000)
            return true;
        else if (x > 10000)
            return true;
        else if (x > 1000)
            return true;
        else if (x > 100)
            return true;
        else if (x > 10)
            return true;
        else if (x > 1)
            return true;
        else
            return false;
    }

注意:C.NET代码示例

关于性能,这可能会因编译器的不同而有所不同,但一般来说应该没有区别。请参见此处的答案:


就哪个更正确而言,这完全取决于所涉及的意图和逻辑。在上面的示例中,只使用if-no-else是完全正确的,因为每个条件都提前存在,并且不存在歧义的可能性。但是,如果您的条件没有提前退出,那么单个值x可以匹配多个条件。因此,正确性取决于每个条件中的逻辑是否应该复合,以便对于具有特定值的x,每个匹配条件中的所有逻辑都应该应用。或者,在这种情况下,无论是否只有一组逻辑运行以响应满足的第一个条件,您都必须使用else if。我从来没有遇到过任何其他原因来选择if和else if,而不是intent,以及每个条件是不同的、不重叠的,还是在效果上是累积的。

关于性能,这可能会根据编译器的不同而有所不同,但一般来说应该没有区别。请参见此处的答案:


就哪个更正确而言,这完全取决于所涉及的意图和逻辑。在上面的示例中,只使用if-no-else是完全正确的,因为每个条件都提前存在,并且不存在歧义的可能性。但是,如果您的条件没有提前退出,那么单个值x可以匹配多个条件。因此,正确性取决于每个条件中的逻辑是否应该复合,以便对于具有特定值的x,每个匹配条件中的所有逻辑都应该应用。或者,在这种情况下,无论是否只有一组逻辑运行以响应满足的第一个条件,您都必须使用else if。我从来没有遇到过任何其他理由来选择if和else if,而不是intent,以及每个条件是不同的、不重叠的还是累积的。

请注意,如果这是Java代码,那么生成的字节码是相同的。请注意,如果这是Java代码,那么生成的字节码是相同的。我想知道为什么,因为我看不出他们有什么不同的原因,但也没有证据表明情况确实如此。我想知道是否有人能够解释为什么会出现这种情况?@MatthewParker没有线索,正如一些人所说,这取决于编译器。我想知道为什么会出现这种情况,因为我看不出它们会有所不同的原因,但也没有证据表明情况确实如此。我想知道是否有人能解释为什么会出现这种情况?@MatthewParker没有任何线索,正如一些人所说,这取决于编译器