我正在使用 std::deque
。我本以为用单个insert
替换带有push_back
循环会提高性能。比如这里建议这样做: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);
}
使用push_back
函数获得203毫秒,使用insert
函数获得218毫秒。
将数组长度len
更改为6
,迭代次数增加到一百万次,结果保持不变:push
函数需要219毫秒,insert
函数需要266毫秒。
只有当len = 640
时,push
函数才稍微逊色,即使如此,差距也很小:使用push
函数需要1531毫秒,使用insert
函数需要1437毫秒。
我在Windows 10下使用VisualStudio 2015的Release模式编译。我确定编译器没有进行优化,例如内联常量迭代次数或者合并循环,因为每次更改实现后只重新编译queueInsert.cpp
文件。
我做性能分析是否有误?或者如果要插入的元素数量不大,我应该继续使用push_back
函数吗?
std::vector
。我已经进行了更正以使意思更清晰。 - Francesco Dondi