C++:检查所有数组元素是否相等的最快方法

Har*_*rma 18 c++ arrays

检查数组的所有元素(首选整数数组)是否相等的最快方法是什么.直到现在我一直在使用以下代码:

bool check(int array[], int n)
{   
    bool flag = 0;

    for(int i = 0; i < n - 1; i++)      
    {         
        if(array[i] != array[i + 1])
            flag = 1;
    }

    return flag;
}
Run Code Online (Sandbox Code Playgroud)

Cub*_*ber 24

int check(const int a[], int n)
{   
    while(--n>0 && a[n]==a[0]);
    return n!=0;
}
Run Code Online (Sandbox Code Playgroud)

  • 如果你发现使用递减索引的吸引力,我建议不要使用`a [0]`作为常量.你开始比较`a [0]`和`a [length-1]`,它们位于数组的两端,在比较开始之前会产生两次RAM往返(对于长度超过64字节的数组). (7认同)
  • 因此,为了回应他对`bool`类型的错误使用,你只需将返回类型转换为`int`就可以了?;) (4认同)
  • 我使用int因为这确实是c代码而不是c ++ (2认同)
  • 那么,在这种情况下,对于实际问题来说它是偏离主题的,不是吗?嗯,无论如何都要投票;) (2认同)
  • 很棒的代码。我会将 n!=0 更改为 n&gt;0,以处理 n=0 的情况 (2认同)
  • 我们能否得到一些与Paul R的答案相比的性能比较? (2认同)

Gab*_*ton 12

这是一个有效的C++ 11的可靠解决方案.优点是您不需要手动使用索引或迭代器.这是一个最好的做法

更喜欢算法调用手写循环[Herb Sutter - C++编码标准]

我认为这与Paul R的解决方案同样有效.

bool check(const int a[], int n)
{
      return !std::all_of(a, a+n, [a](int x){ return x==a[0]; });
}
Run Code Online (Sandbox Code Playgroud)


Pau*_*l R 10

一旦找到不匹配的元素,就可以摆脱循环:

bool check(const int array[], int n)
{   
    for (int i = 0; i < n - 1; i++)      
    {         
        if (array[i] != array[i + 1])
            return true;
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

如果这对性能至关重要,那么可以进一步优化:

bool check(const int array[], int n)
{   
    const int a0 = array[0];

    for (int i = 1; i < n; i++)      
    {         
        if (array[i] != a0)
            return true;
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

  • 使用常量元素(通常是第一个)来比较所有其他元素,允许编译器在循环外提升它的负载.不确定会有多大的影响. (3认同)

Ale*_*sky 5

将数组重新转换为更大的数据类型。例如,对 64 位整数进行操作,或使用 SSE 或 AVX 内在函数进行 128 或 256 位操作。例如,SSE2 内在函数是 _mm_cmpeq_epi32,其结果将与 _mm_or_si128 一起使用。重复应用 _mm_srli_si128 和 _mm_cvtsi128_si32 检查结果。每几百次迭代检查一次结果以便提前退出​​。

确保在对齐的内存上进行操作,将未对齐的开始和结束检查为整数,并检查第一个打包元素及其自身。

  • 也许我们可以重用 glibc 的“memcmp”(已经进行了汇编优化):1)将数组分割成大小相等的部分。2) 比较它们 3) 如果不同,返回 false。否则取前半部分,忽略后半部分) 4)将前半部分分成两部分。5) ...这导致只有N次比较。 (2认同)