【问题标题】:Performance hit from using std::find [closed]使用 std::find 对性能的影响 [关闭]
【发布时间】:2016-01-28 18:25:58
【问题描述】:

我有以下代码来检查一个值是否属于一个值列表。例如:contains({1,2,3},3)。几乎总是,我可以写一堆if-elses。 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());
}

【问题讨论】:

  • 在投反对票之前,我会感谢 cmets 了解问题所在。
  • 1.衡量 2。明确你如何衡量 3。然后问也许。
  • “几乎总是,我可以写一堆 if-else”是什么意思?据推测,find_if 还包含一堆“if-else”。你的意思是你总是将它应用到一个预先知道大小的微小序列上吗?
  • @AmiTavory,不同的是 find_if 包含 loop。但是,正如我在回答中所展示的那样,循环展开是为了拯救。

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


【解决方案1】:

使用知道如何展开循环的优秀优化编译器,您最终将获得几乎相同的程序集和相同的性能。

证明:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-12
    • 2011-04-05
    • 1970-01-01
    • 2018-06-28
    • 1970-01-01
    • 2012-12-10
    • 2013-02-03
    相关资源
    最近更新 更多