【问题标题】:Efficiency of the switch statementswitch 语句的效率
【发布时间】:2013-01-22 05:07:35
【问题描述】:

我目前正在编写快速排序算法的实现,我有一个效率问题,特别是关于对数组进行分区。我在排序之前对数组进行分区的方式包括选择枢轴或分区元素作为数组中的第一个元素(我知道。这不是最有效的方法),然后设置两个变量 - “高”和“低”——分别是数组的最后一个索引和第一个索引。我有一个 while 循环设置,它通过切换某些元素并递增和递减低和高直到它们相等来对数组进行分区。

我的问题是我使用 switch 语句来控制要移动的索引,而不是设置两个单独的 while 循环来执行此操作。在这种情况下使用 switch 语句是否更有效?

以下是相关代码:

    //used to determine which side of the array to move the element to
    #define RIGHT 1
    #define LEFT 0

    void partition( int nums[], int size )
    {
         int pivot = nums[0], low = 0, high = size - 1, turn = LEFT;

         while ( low != high )
         {

             switch (turn)
             {
                case RIGHT:
                     if ( nums[low] >= pivot )
                     {
                         nums[high] = nums[low];
                         high--;
                         turn = LEFT;
                     }
                     else
                         low++;
                     break;

                case LEFT:
                     if ( nums[high] <= pivot )
                     {
                         nums[low] = nums[high];
                         low++;
                         turn = RIGHT;
                     }
                     else
                         high--;
                     break;
            }
        }

        nums[low] = pivot;
     }

【问题讨论】:

  • 您是否考虑过尝试自己衡量差异?

标签: c switch-statement performance


【解决方案1】:

如果不进行实际测试,您将无法知道。编译器有时可以做一些令人惊奇的事情(无论好坏都令人惊讶)。一般来说,我希望它更快地移动到两个循环,因为状态保存在程序计数器中,但编译器可能会这样做或更好。它也会随着编译时的优化设置而变化。

【讨论】:

    【解决方案2】:

    我的猜测是两个循环,但是测量

    通常最好将不变表达式从循环中移出。这种优化称为code hoisting.循环不变的代码运动。它获胜的原因很明显。现在,在您的情况下,编译器不清楚什么是不变的,但您知道 turn 变量是 less 变体,而不是 low 和 高。

    所以,我的猜测是两个循环更好,但唯一确定的方法是测量它。

    【讨论】:

      猜你喜欢
      • 2012-05-14
      • 1970-01-01
      • 1970-01-01
      • 2012-02-03
      • 1970-01-01
      • 2011-08-03
      • 1970-01-01
      • 1970-01-01
      • 2011-02-02
      相关资源
      最近更新 更多