使用std :: find打击了性能

时间:2016-01-28 18:25:58

标签: c++ templates c++11 c++14

我有以下代码来检查值是否属于值列表。例如:contains({1,2,3},3)。几乎总是,我可以写一堆if-else s。 contains方法创造了多少性能影响?有没有办法避免这种情况?

template<typename T1,typename T2>
std::enable_if_t<std::is_same<std::initializer_list<T2>,T1>::value, bool> contains(const T1 &container,const T2 &item)
{
    return(std::find(container.begin(),container.end(),item)!=container.end());
}

1 个答案:

答案 0 :(得分:4)

通过良好的优化编译器知道如何展开循环,你将得到几乎相同的程序集和相同的性能。

证明:

find_if

#include <algorithm>
#include <initializer_list>

template<typename T1,typename T2>
bool contains(const T1 &container,const T2 &item) {
    return(std::find(container.begin(),container.end(),item)!=container.end());
}

bool foo(int a, int b, int c, int d, int e) {
  return contains(std::initializer_list<int>({a, b, c, d, e}), 5);
}

大会:

foo(int, int, int, int, int):
        cmpl    $5, %edi        #, a
        je      .L6 #,
        cmpl    $5, %esi        #, b
        je      .L6 #,
        cmpl    $5, %edx        #, c
        je      .L6 #,
        cmpl    $5, %ecx        #, d
        je      .L6 #,
        cmpl    $5, %r8d        #, e
        sete    %al     #, D.75010
        ret

if-else

bool foo(int a, int b, int c, int d) {
  if (a == 5)
    return true;
  else if (b == 5)
    return true;
  else if (c == 5)
    return true;
  else if (d == 5)
    return true;
  return false;
}

大会:

foo(int, int, int, int):
        cmpl    $5, %edx        #, c
        sete    %dl     #, D.74611
        cmpl    $5, %ecx        #, d
        sete    %al     #, D.74611
        orl     %edx, %eax        # D.74611, D.74611
        cmpl    $5, %esi        #, b
        sete    %dl     #, D.74611
        orl     %edx, %eax        # D.74611, D.74611
        cmpl    $5, %edi        #, a
        sete    %dl     #, D.74611
        orl     %edx, %eax        # D.74611, D.74611
        ret