vector push_back()速度超慢

tbg1986tbg 2012-08-28 03:51:21
如下定义个结构体
typedef struct tagDXFLine
{
CPoint startPoint;
CPoint endPoint;
}DXFLINE;


typedef std::vector<tagDXFLine> CDXFLineList;//存贮对象
typedef std::vector<tagDXFLine*> CDXFTempLineList;//存贮指针

CDXFLineList m_myDXFLineList;
CDXFTempLineList tempDXFLineList;//保存临时的线条

其中
DWORD t1 = timeGetTime();
//tempDXFLineList.reserve(1024);//有人说需要开始预设一个足够大的内存空间。我设置了1000000,结果还是慢 //m_myDXFLineList.reserve(1024);
for (int j=m_myDXFLineList.size()-1; j>=0; j--)
{
DXFLINE tempLine;
bAdd = FALSE;
CPoint TempLineEndPoint=(*tempDXFLineList.at(tempDXFLineList.size()-1)).endPoint;
CPoint StartPoint=m_myDXFLineList.at(j).startPoint;
CPoint EndPoint=m_myDXFLineList.at(j).endPoint;
if (StartPoint==TempLineEndPoint)
{
tempLine.startPoint=StartPoint;
tempLine.endPoint=EndPoint;
tempDXFLineList.push_back(&tempLine);//这里花费的时间很长。如果数据小的话,还好。数据太大的话,就会耗时很长。如何解决呢? m_myDXFLineList.erase(m_myDXFLineList.begin()+j);
bAdd = TRUE;

}else
{
if (EndPoint==TempLineEndPoint)
{
tempLine.startPoint=EndPoint;
tempLine.endPoint=StartPoint;
tempDXFLineList.push_back(&tempLine);//同样耗时很长? m_myDXFLineList.erase(m_myDXFLineList.begin()+j);
bAdd = TRUE;
}
}

if (bAdd)
{
j=m_myDXFLineList.size();
}

}
DWORD t2 = timeGetTime();
double spend=(double)(t2-t1);
CString msg;
msg.Format(_T("运行完成,一共花费时间为:%d毫秒"),(int)spend);
AfxMessageBox(msg);
// m_myBufferList.push_back(&tempDXFLineList);

}
...全文
1509 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
whucv 2012-09-02
  • 打赏
  • 举报
回复
vector<X> v;
v.assin(size);这个才真正分配内存,reserve只是保留。
chengbin71 2012-09-01
  • 打赏
  • 举报
回复
使用randisk开辟一个内存盘R 在R盘里面运行release程序 速度快十倍以上
tbg1986tbg 2012-08-31
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]
C/C++ code

class CTimeCaster
{
public:
CTimeCaster()
{
m_tick = GetTickCount();
}


我看你的循环1000万次的也需要563毫秒了。

我的是在20万个点中,每行大概300个点,共有720行左右。
从20个点中,找出每行的300个点,在把每行的300个点依次排序(每个点之间中直线连接着。即找出哪些直线在和对应的点连接着)。
所以这种情况下:最坏的情况下就需要循环:20万乘以20万=40000000000这么多次吧?

如果这样的情况下。是不是push_bacK的时间就出现1000-2000多毫秒每次?

tbg1986tbg 2012-08-29
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 的回复:]
请问个问题。tempDXFLineList.reserve(1000000); 预先分配个100万空间

如何知道预设的空间是否成功?

tempDXFLineList.size()???好像不正确呀。 结果是1不是1000000?
[/Quote]

内存不到2G?就不能用reserve(1000000); ??吗?
hztj2005 2012-08-28
  • 打赏
  • 举报
回复
下面代码可以用pop() 或 back()改写,速度应该更快。

for (int j=m_myDXFLineList.size()-1; j>=0; j--)
{
DXFLINE tempLine;
bAdd = FALSE;
CPoint TempLineEndPoint=(*tempDXFLineList.at(tempDXFLineList.size()-1)).endPoint;
CPoint StartPoint=m_myDXFLineList.at(j).startPoint;
CPoint EndPoint=m_myDXFLineList.at(j).endPoint;
if (StartPoint==TempLineEndPoint)
{
tempLine.startPoint=StartPoint;
tempLine.endPoint=EndPoint;
tempDXFLineList.push_back(&tempLine);//这里花费的时间很长。如果数据小的话,还好。数据太大的话,就会耗时很长。如何解决呢? m_myDXFLineList.erase(m_myDXFLineList.begin()+j);
bAdd = TRUE;

}else
hztj2005 2012-08-28
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 的回复:]
请问个问题。tempDXFLineList.reserve(1000000); 预先分配个100万空间

如何知道预设的空间是否成功?

tempDXFLineList.size()???好像不正确呀。 结果是1不是1000000?
[/Quote]

代开任务管理器,执行到这句时,使用内存就显著增加。

你的内存不到2G?
tbg1986tbg 2012-08-28
  • 打赏
  • 举报
回复
请问个问题。tempDXFLineList.reserve(1000000); 预先分配个100万空间

如何知道预设的空间是否成功?

tempDXFLineList.size()???好像不正确呀。 结果是1不是1000000?
hotpos 2012-08-28
  • 打赏
  • 举报
回复

class CTimeCaster
{
public:
CTimeCaster()
{
m_tick = GetTickCount();
}

~CTimeCaster()
{
printf("time %dms\n", GetTickCount() - m_tick);
}

protected:
DWORD m_tick;
};

struct Point
{
int x, y;
};

struct Line
{
Point from, to;
};

int _tmain(int argc, _TCHAR* argv[])
{
const int sz = 100 * 10000;

{
CTimeCaster t;

std::vector<Line> vec(sz);

for (int i=0; i<sz; i++)
{
Line l = {i, i, i, i};
vec[i] = l;
}
}

{
CTimeCaster t;

std::vector<Line> vec;
vec.resize(sz);

for (int i=0; i<sz; i++)
{
Line l = {i, i, i, i};
vec[i] = l;
}
}

{
CTimeCaster t;

std::vector<Line> vec;
vec.reserve(sz);

for (int i=0; i<sz; i++)
{
Line l = {i, i, i, i};
vec.push_back(l);
}
}

{
CTimeCaster t;

std::vector<Line> vec;
for (int i=0; i<sz; i++)
{
Line l = {i, i, i, i};
vec.push_back(l);
}
}

return 0;
}


100万个
time 16ms
time 15ms
time 16ms
time 47ms

1000万个
time 187ms
time 219ms
time 203ms
time 563ms

VS2008 Release数据 不知道你怎么测出你那个结果的
tbg1986tbg 2012-08-28
  • 打赏
  • 举报
回复
请问个问题。tempDXFLineList.reserve(1000000); 预先分配个100万空间

如何知道预设的空间是否成功?

tempDXFLineList.size()???好像不正确呀。 结果是1不是1000000?



tbg1986tbg 2012-08-28
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
一:只要你reserve比你真实数据更大的空间,push_back肯定不耗时。
刚才试过开始的时候 tempDXFLineList.resize(1000000); 预先分配个100万空间。
在for (int j=m_myDXFLineList.size()-1; j>=0; j--)
用CString test;
test.Format(_T("%d"),tempDXFLineList.capacity());
AfxMessageBox(test);
输出的tempDXFLineList 大小也是100万。说明我已经预设成功好了大小。

二:如果你的m_myDXFLineList数据量也很大的话,那么问题可能出在m_myDXFLineList.erase,它才是真正耗时的(如果你满足了第一点的话)。
但是当我注释掉tempDXFLineList.push_back(&tempLine);这句代码的时候,这段代码的执行速度10万和20万就差异不大了。所以我才怀疑是push_back导致的慢?
注:reserve是对的,resize虽然也可,但会效率低些。
[/Quote]


tbg1986tbg 2012-08-28
  • 打赏
  • 举报
回复
我现在debug和release模式下都试过。结果是10万点和20万点的花费时间差异很大。在debug 模式下10万点处理的话大概需要15毫秒左右。20万点的话需要几千毫秒。 release下稍微好些,但是差异还是数量级别上的差异。
刚才试过开始的时候 tempDXFLineList.resize(1000000); 预先分配个100万空间。


在for (int j=m_myDXFLineList.size()-1; j>=0; j--)
用CString test;
test.Format(_T("%d"),tempDXFLineList.capacity());
AfxMessageBox(test);
输出的tempDXFLineList 大小也是100万。说明我已经预设成功好了大小。那为什么push_back还是慢呢?

需要保存指针?
xiaohuh421 2012-08-28
  • 打赏
  • 举报
回复
你测试时间是在debug下还是在release下.
youngwolf 2012-08-28
  • 打赏
  • 举报
回复
一:只要你reserve比你真实数据更大的空间,push_back肯定不耗时。
二:如果你的m_myDXFLineList数据量也很大的话,那么问题可能出在m_myDXFLineList.erase,它才是真正耗时的(如果你满足了第一点的话)。

注:reserve是对的,resize虽然也可,但会效率低些。
tbg1986tbg 2012-08-28
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
先预设大小,函数为resize,而不是reserve;再试试吧,预设了大小,应该不至于太慢。
[/Quote]
都试过了。resize 和reserve都试过了。结果还是push_back那里最耗时。
感觉视乎和没有预设大小一样?
如何看我预设大小成功了没?
周成风 2012-08-28
  • 打赏
  • 举报
回复
先预设大小,函数为resize,而不是reserve;再试试吧,预设了大小,应该不至于太慢。
tbg1986tbg 2012-08-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
你多大的数据量?
[/Quote]
20-100万左右个点。测试的时候10万个点速度还可以。但是我换成20万的话。速度突然就很慢了。跟踪发现是push_back()这里耗时比较猛、 好奇怪按道理10万点也算是多了。但是10万和20万差距这么大?
tbg1986tbg 2012-08-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
vector随着数据递增,会增加push时间,关键是你的数据量有多大
[/Quote]

20-100万左右个点。测试的时候10万个点速度还可以。但是我换成20万的话。速度突然就很慢了。跟踪发现是push_back()这里耗时比较猛、 好奇怪按道理10万点也算是多了。但是10万和20万差距这么大?
Gloveing 2012-08-28
  • 打赏
  • 举报
回复
数据量小的话,速度还能接受,大的话,就别用vector啦
hurryboylqs 2012-08-28
  • 打赏
  • 举报
回复
你多大的数据量?
oyljerry 2012-08-28
  • 打赏
  • 举报
回复
vector随着数据递增,会增加push时间,关键是你的数据量有多大
加载更多回复(1)

15,978

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧