使用 std::find 对性能的影响
Performance hit from using std::find
我有以下代码来检查值是否属于值列表。 例如:contains({1,2,3},3)
.几乎总是,我可以写一堆if-else
。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());
}
使用知道如何展开循环的良好优化编译器,您最终将获得几乎相同的程序集和相同的性能。
证明:
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
相关文章:
- 数组中的不同浮点值会影响性能 10 倍 - 为什么?
- 为 lambda 分配名称会影响性能吗?
- 通过默认复制构造函数比较 C++ 字符串是否会影响性能,原因为何?
- 隐式转换函数的返回对象时是否会影响性能?
- 何时应使用 C++ 固定宽度整数类型,它们如何影响性能?
- 性能 - 链接 C 尖锐和C++如何影响性能
- C 指针向量如何影响性能
- 公开类的内部组件,以防止编写过多代码和影响性能
- .NET 4,C ,IF..Else和Switch()如何影响性能
- 变量会影响性能吗
- 更改自动分配内存的范围是否会影响性能
- 如何修复不影响性能的"runtime error"?
- 返回间接类型化对象是否会影响性能
- 调用恒定复杂度O(1)5行函数会显著影响性能,原因如下
- 使用Pimpl的高级变体时可能会影响性能
- 功能原型设计会影响性能吗
- 在C/ c++中包含未使用的头文件会影响性能吗?
- 我可以在不影响性能的情况下将此宏更改为内联函数吗
- Dispatch_async在下面的代码中影响性能
- c++中的操作符重载如何影响性能