切换声明的效率

时间:2013-01-22 05:07:36

标签: c switch-statement performance

我目前正在编写快速排序算法的实现,我有一个效率问题,特别是有关分区数组的问题。我在排序之前对数组进行分区的方法包括选择pivot或partitioning元素作为数组中的第一个元素(我知道。这不是最有效的方法),然后设置两个变量 - “high”和“低” - 分别是数组的最后一个索引和第一个索引。我有一个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;
     }

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

将不变表达式从循环向外移动通常会更好。此优化称为code hoisting.循环不变代码运动。它胜出的原因很明显。现在,在你的情况下,编译器不明显什么是不变量,但是你知道变量 less 变种 low 和< EM>高

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