返回首页
当前位置: 主页 > 编程语言 > C#教程 >

switch和if else 哪个效率高-C#多分支效率比较

时间:2017-03-06 12:17来源:电脑教程学习网 www.etwiki.cn 编辑:admin

在 C# 中,多分支语句有两种,一种是 if elseif,另一种是 switch。在编程过程中,该用哪一种,应该根据具体情况和程序的执行效率决定。本文将探讨 switch 和 if elseif 倒底哪个效率高,下面是具体分析。

  先看两种语句实现的代码:

  //页面初始化
  protected void Page_Load(object sender, EventArgs e)
  {
    If_Elseif(3);
    Switch_Case(3);
  }

  //测试 if elseif
  public string If_Elseif(int n)
  {
    string returnValue = "打折网";

    Stopwatch sw = new Stopwatch();
    sw.Start();

    for (int i = 0; i < 10000000; i++)
    {
      if (n == 1)
        returnValue = "网页打不开";
      else if (n == 2)
        returnValue = "网页打开慢";
      else if (n == 3)
        returnValue = "网页显示不正常";
      else if (n == 4)
        returnValue = "购物打折";
      else if (n == 5)
        returnValue = "银行网页打不开";
      else if (n == 6)
        returnValue = "360网页打不开";
    }
    sw.Stop();
    lblRunTime.Text = "If_Elseif: " + sw.ElapsedMilliseconds;//label 标签
    return returnValue;
  }

  //测试 Switch case
  public string Switch_Case(int n)
  {
    string returnValue = "打折网";

    Stopwatch sw = new Stopwatch();
    sw.Start();

    for (int i = 0; i < 10000000; i++)
    {
      switch (n)
      {
        case 1:
          returnValue = "网页打不开";
          break;
        case 2:
          returnValue = "网页打开慢";
          break;
        case 3:
          returnValue = "网页显示不正常";
          break;
        case 4:
          returnValue = "购物打折";
          break;
        case 5:
          returnValue = "银行网页打不开";
          break;
        case 6:
          returnValue = "360网页打不开";
          break;
        default:
          break;
      }
    }
    sw.Stop();
    lblRunTime.Text += "ms Switch_Case: " + sw.ElapsedMilliseconds + "ms";
    return returnValue;
  }

  运行结果:

  If_Elseif: 162ms Switch_Case: 71ms

  从运行结果可以看出,if elseif 用的时间比 Switch 多出91ms,程序循环了10000000次。如果循环次数继续增加,Switch 的效率更为明显,可见 Switch 的效率比 if elseif 要高。

  switch 之所以快,是因为编译后 switch 增加了一个索引跳转,而 if ... elseif 没有增加索引跳转。看反编译后的 ildasm 代码,可以发现 Switch_Case 方法中增加了下面这一句:

  switch (IL_003f, IL_0047, IL_004f, IL_0057, IL_005f, IL_0067)

  正是它实现了一个 jump table。  

------分隔线----------------------------
标签(Tag):c#
------分隔线----------------------------
推荐内容
猜你感兴趣