c - switch语句的效率

标签 c switch-statement performance

我目前正在编写快速排序算法的实现,并且我有一个效率问题,特别是关于数组分区的问题。我在排序之前对数组进行分区的方式涉及选择枢轴或分区元素作为数组中的第一个元素(我知道。这不是最有效的方法),然后设置两个变量 - “high”和“low”-分别是数组的最后一个索引和第一个索引。我有一个 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语句的效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14451919/

相关文章:

mysql - 存储大量数据的最佳方法

c - 在Windows中获取纳秒级执行时间

Cygwin 或 Gnuwin32 或 MYSYS?

c - 在名称管道开放系统的情况下是阻塞调用还是读写?

C# switch 语句字符串到字符错误

c# - .NET 应用程序在长时间不活动后速度非常慢

c# - PInvoke 将来自 ANSI C 的结构指针编码(marshal)为 C# 中的 IntPtr

c - C 中的 switch case 多个范围

android - 如何从以前的 Activity 中获取额外信息以设置不同的按钮 Intent ?

c++ - 我怎样才能使这个简单的 Fortran 90 代码更快?