有条件的大平面数组遍历和令人惊讶的短循环执行时间



我需要对我通过经验发现的一些东西进行解释。我有一个非常大的char类型的平面数组。该阵列的总长度为500x500x500=125E+6个字节。在单元格内,我保留一个介于0和255之间的数字。但幸运的是,当遍历数组时,我只对具有非零值的单元格感兴趣!

现在问题来了。我通过实验发现,在处理整个零和非零数组时,即使对单元格进行最小的运算也需要花费大量时间,而如果我使用类似于下面的条件,

while( index < 125000000 )
{
    if( array[ index ] > 0 )
    {
        // Do some stuff
    }
    index++;
}

执行时间大大缩短。事实上,我可以在几秒钟内遍历整个数组并对非零单元格执行操作,而不是在没有条件的情况下执行半小时的方法。

我需要的是解释为什么这样做!我需要在我的论文报告中解释这种现象,如果我能与一篇科学论文或类似的论文联系起来,那将是最好的。

提前谢谢!

谨致问候,Omid Ariyan

这可能是因为您希望char是无符号的,因此能够保持[0255]范围内的值,但实际上它是有符号的,保持[-128127]范围内(假设二的补码)的值。因此,array[ index ] > 0比您预期的要小得多的情况,因为所有赋值大于127的元素都将具有负值。

请注意,您声称要检查非零值,但实际上是在检查正值。

您可以在您的平台上查看char的范围:

#include <limits>
#include <iostream>
int main()
{
  std::cout << static_cast<int>(std::numeric_limits<char>::min()) << std::endl;
  std::cout << static_cast<int>(std::numeric_limits<char>::max()) << std::endl;
  char c = 234;
  std::cout << static_cast<int>(c) << std::endl; // 234 if unsigned, -22 if signed
}

最新更新