【发布时间】:2016-07-20 14:00:44
【问题描述】:
我正在使用std::deque。我确信用一个push_back 替换一个循环insert 会提高性能。也推荐使用,例如here。
但现在我不再那么确定了。
我已经对测试代码运行了一些基准测试。
Main.cpp:
#include"queueInsert.h"
#include<Windows.h>
std::deque<int> queue;
constexpr size_t len = 64;
int arr[len];
int main()
{
DWORD startTime = GetTickCount();
for (int i = 0; i < 100000; ++i)
{
insert(queue, arr, len);
}
DWORD endTime = GetTickCount();
return endTime - startTime;
}
queueInsert.h:
#include<deque>
void insert(std::deque<int>&, int* arr, int n);
queueInsert.cpp -push 版本
#include "queueInsert.h"
void insert(std::deque<int>& queue, int* arr, int n)
{
for (int i = 0; i < n; ++i)
{
queue.push_back(arr[i]);
}
}
queueInsert.cpp -插入版本
#include "queueInsert.h"
void insert(std::deque<int>& queue, int* arr, int n)
{
queue.insert(queue.end(), arr, arr + n);
}
我得到203 毫秒与push_back,但218 与insert。
将len 更改为6,并将迭代次数增加到一百万,保持相同的结果:219 磨削push 和266 磨削insert。
只有在 len = 640 的情况下,push 才会输掉,即使这样输得也很少:1531 代表 push 与 1437 代表 insert。
我正在 Windows 10 下的 VisualStudio 2015 版本中编译。
我确定编译器不会像内联迭代次数或融合循环那样进行优化,因为每次我更改实现时,只会重新编译 queueInsert.cpp。
我做的分析错了吗?或者如果要插入的元素数量不大,我是否应该保留push_back?
【问题讨论】:
-
我确定编译器没有进行优化 -- 让我们看看汇编列表。
-
我读过原创文章,没关系
-
我的意思是向量作为元素序列,而不是
std::vector。我已更正以使意思更清楚。 -
"如果要插入的元素数量不太可能很大,我是否应该实际保留 push_back?" 考虑到在这种情况下性能差异是多么微不足道,做任何让你的代码看起来最合理的事情。
-
这篇文章是2011年的。
标签: c++ performance stl