使用预先计算的数组或函数

Use a precomputed array or a function?

本文关键字:数组 函数 计算      更新时间:2023-10-16

在c++中使用GCC编译时什么更快,

使用2列300行的预计算数组,

或使用三级多项式,如"x^3 + x^2 + x + 40" ?

(对不起我的英语)

编辑:

在数组中搜索速度更快,(输入值在第一列,输出第二列。)还是使用函数(多项式的输入和输出是显而易见的)?

edit2:

使用指数

我想他是在比较多项式计算和查找表之间的速度。

视情况而定。查找表通常存储在内存中,并且将涉及LD指令。如果查找表没有缓存,那么预计内存会有很长的延迟。

如果需要频繁且多次访问查找表,且查找表的大小合理,请尝试使用lookup table。这是因为,该表很可能会被缓存。如果您能够将表存储在堆栈上,那么就这样做。因为栈上的数据比堆上的数据更有可能被缓存。

另一方面,如果计算不频繁,那么使用多项式计算是可以的。

您应该实际分析代码。

多项式评价
函数是:

int Evaluate_Polynomial(int x)
{
  register const int term1 = x * x * x;
  register const int term2 = x * x;
  register const int result = term1 + term2 + x + 40;
  return result;
}  

注意:在上面的函数中,register用于提醒编译器使用寄存器,即使在未优化的版本(即调试)中也是如此。

未经优化,上述函数有3次乘法运算和3次加法运算,总共6次数据处理操作(不包括加载和存储)。

表查找


函数是:

int Table_Lookup_Polynomial(int x)
{
  int result = 0;
  if ((x < 0) || (x > 300))
  {
    result = table[x];
  }
  else
  {
    // Handle array index out of bounds
  }
  return result;
}

在上面的例子中,有可能进行3次比较(跳转)和一次指针解引用。重要的是,需要进行错误处理。


多项式版本可能包含更多指令,但它们是数据处理指令,可以很容易地内联。它们不会导致处理器的指令缓存被重新加载。

表查找需要执行边界检查。边界检查将导致处理器暂停并可能重新加载指令管道,这需要时间。如果范围发生变化,错误检查和处理可能会在维护期间引起问题。

应该对函数进行概要分析,以验证哪种算法更快。由于改变执行流而造成的时间损失可能比多项式求值的纯数学数据处理函数要长。

编译器可以使用特殊的处理器函数使多项式求值更快。例如,ARM7处理器具有可以执行乘法和加法的指令。

计算三级多项式几乎总是更快。

人们似乎忘记了他们需要在这个"查找"表中搜索值。即O(log N)

评估3级的多项式是非常琐碎的,表需要小到无用才能胜过它。

只有当您准确地存储了您要查找的参数的值并且您知道它们在表中的位置时,该表才有机会。因此,您不必执行搜索。这将使它成为一个真正的查找表,并且可能会更快。

我知道的例子,表确实是使用计算正弦函数高精度(更多在维基)。虽然,这样的计算会非常昂贵。