我有以下两个功能。我使用随机排序的向量执行每个约200K次(每个函数获得相同的两个向量,但向量在运行之间变化)。我有点困惑,因为我的代码在所有200K迭代中总共运行大约500毫秒,而STD函数调用运行在440毫秒。 ~60ms在哪里? STD做了什么(或者没做过),我做了哪些不同的事情?
我在核心i5上使用Visual Studio 10.
int getAndIntersectMine(std::vector<int>& resultContainer)
{
std::vector<int> const& vector0 = getSomeVector();
std::vector<int> const& vector1 = getAnotherVector();
const int length0 = vector0.size();
const int length1 = vector1.size();
const int* ptr0 = &vector0[0];
const int* ptr1 = &vector1[0];
int i0 = 0;
int i1 = 0;
int numels = 0;
while(i0 < length0 && i1 < length1)
{
if(ptr0[i0] == ptr1 [i1]) {
resultContainer[numels++] = ptr0[i0];
i0++;
i1++;
}
else if (ptr0[i0] > ptr1[i1])
{
i1++;
}
else
{
i0++;
}
}
return numels;
}
int getAndIntersectStds(std::vector<int>& resultContainer)
{
std::vector<int> const& vector0 = getSomeVector();
std::vector<int> const& vector1 = getAnotherVector();
std::vector<int>::iterator last =
std::set_intersection(
vector0.begin(),
vector0.end(),
vector1.begin(),
vector1.end(),
resultContainer.begin());
return last - resultContainer.begin();
}
答案 0 :(得分:1)
我认为问题在于你使用的是订阅而不是迭代器。
迭代std算法时(在指针eqv中)
int * beg = &v[0];
int * end = &v[0] + v.size();
while(beg != end)
{
...
++beg;
}
你的思维更广泛
int * beg = &v[0];
int i = 0, s = v.size();
while(i != s)
{
//use beg[i], which is *(beg + i)
...
++i;
}
并且还增加了...但我认为它已经过优化