切换大量案例与单个if

时间:2017-03-02 08:23:20

标签: c performance if-statement switch-statement theory

假设我们需要通过一个128元素的uint8数组并比较邻居元素并将结果放到另一个数组中。下面的代码是解决此问题的最简单易读的方法。

for (i = 1; i < 128; i++)
  if (arr[i] < arr[i-1] + 64) //don't care about overflow
    arr2[i] = 1;

看起来此代码1)不会使用分支表。 据我所知,一个cpu不只读取1个字节,它实际上读取8个字节(假设是64位机器),而 2)使cpu做了一些额外的工作。

所以这是另一种方法。一次读取2个(或4个或8个)字节并创建一个非常大的开关(分别为2 ^ 16,2 ^ 32或2 ^ 64个),它们在我们的数组中具有每个可能的字节组合。这有什么意义吗?

在本次讨论中,我们假设如下: 1)我们的主要优先事项是速度 2)接下来是RAM消耗。 我们不关心可执行文件的大小(除非它们以某种方式影响速度或RAM)

1 个答案:

答案 0 :(得分:1)

您应该知道交换机实际上非常慢,因为分支可能会被错误预测。切换快速的原因是跳转表:

switch (i) {
   case 0: ...
   case 1: ...
}

被翻译成:

labels = {&case0, &case1}
goto labels[i]

但是,你不需要将它作为你唯一的写入存储单元,你可以自己编写一个“跳转表”,或者更具体地说是预先计算出的答案矩阵:

for (i = 1; i < 128; i++)
   arr2[i] = answers[arr[i]][arr[i-1]];

uint8只有256个可能的值,这为我们提供了64k的RAM。