编辑: 我已经修复了插入。正如 Blastfurnace 友好地提到的那样,插入使迭代器无效。我认为需要循环来比较性能(请参阅我对 Blastfurnance 答案的评论)。我的代码已更新。我对列表有完全相似的代码,只是用列表替换了向量。但是,通过代码,我发现对于小型和大型数据类型,甚至对于线性搜索(如果我删除插入),列表的性能都比向量好。根据http://java.dzone.com/articles/c-benchmark-%E2%80%93-stdvector-vs和其他网站认为不应该是这样。有什么线索可以说明这一点吗?
我正在学习数学软件编程课程(周一考试),为此我想展示一个图表,比较将元素随机插入向量和列表之间的性能。但是,当我测试代码时,我会随机减速。例如,我可能有 2 次迭代,其中将 10 个元素随机插入到大小为 500 的向量中需要 0.01 秒,然后是 3 次类似的迭代,每次大约需要 12 秒。这是我的代码:
void AddRandomPlaceVector(vector<FillSize> &myContainer, int place) {
int i = 0;
vector<FillSize>::iterator iter = myContainer.begin();
while (iter != myContainer.end())
{
if (i == place)
{
FillSize myFill;
iter = myContainer.insert(iter, myFill);
}
else
++iter;
++i;
}
//cout << i << endl;
}
double testVector(int containerSize, int iterRand)
{
cout << endl;
cout << "Size: " << containerSize << endl << "Random inserts: " << iterRand << endl;
vector<FillSize> myContainer(containerSize);
boost::timer::auto_cpu_timer tid;
for (int i = 0; i != iterRand; i++)
{
double randNumber = (int)(myContainer.size()*((double)rand()/RAND_MAX));
AddRandomPlaceVector(myContainer, randNumber);
}
double wallTime = tid.elapsed().wall/1e9;
cout << "New size: " << myContainer.size();
return wallTime;
}
int main()
{
int testSize = 500;
int measurementIters = 20;
int numRand = 1000;
int repetionIters = 100;
ofstream tidOutput1_sum("VectorTid_8bit_sum.txt");
ofstream tidOutput2_sum("ListTid_8bit_sum.txt");
for (int i = 0; i != measurementIters; i++)
{
double time = 0;
for (int j = 0; j != repetionIters; j++) {
time += testVector((i+1)*testSize, numRand);
}
std::ostringstream strs;
strs << double(time/repetionIters);
tidOutput1_sum << ((i+1)*testSize) << "," << strs.str() << endl;
}
for (int i = 0; i != measurementIters; i++)
{
double time = 0;
for (int j = 0; j != repetionIters; j++) {
time += testList((i+1)*testSize, numRand);
}
std::ostringstream strs;
strs << double(time/repetionIters);
tidOutput2_sum << ((i+1)*testSize) << "," << strs.str() << endl;
}
return 0;
}
struct FillSize
{
double fill1;
};
该结构只是为了让我轻松添加更多值,以便我可以测试不同大小的元素。我知道这段代码在性能测试方面可能并不完美,但他们宁愿让我做一个简单的例子,也不愿简单地引用我发现的东西。
我现在已经在两台计算机上测试了这段代码,它们都有同样的问题。这个怎么可能?你能帮我解决一下,这样我就可以绘制它并在星期一展示它吗?也许在每次迭代之间增加几秒钟的等待时间会有所帮助?
亲切的问候, Bjarke