大神,求救!!为什么delete要比new慢?

lzt20007 2012-09-20 09:27:01
class CMatrix1
{
public:
double matrix[16];
CMatrix1()
{
}
~CMatrix1()
{
};
};


//测试
{
DWORD tickCount = 0;
char tempStr[1024] = {0};


//1. 赋值
tickCount = GetTickCount();
std::vector<CMatrix1*> matrixList;
matrixList.resize(264633);
for (int i = 0; i < 264633; i ++)
{
CMatrix1 *des = new CMatrix1;
matrixList[i] = des;
}
tickCount = GetTickCount() - tickCount;
memset(tempStr,0,1024);
sprintf(tempStr,"segment paras new: %d s", tickCount/1000);
OutputLogString(tempStr); //写文件函数,用于调试输出


//2. 析构
tickCount = GetTickCount();
for (int i = 264632; i >=0 ; i --)
{
delete matrixList[i];
}
tickCount = GetTickCount() - tickCount;
memset(tempStr,0,1024);
sprintf(tempStr,"segment paras delete: %d s", tickCount/1000);
OutputLogString(tempStr);
}
...全文
371 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
freelancer_ex 2012-09-21
  • 打赏
  • 举报
回复
可以试试重载这个类的new/delete
将这个类的内存在一个新的堆上分配/释放。
不晓得有没有效果
具体代码可以在《Windows核心编程》书上找到的
一叶之舟 2012-09-21
  • 打赏
  • 举报
回复
CMatrix1 *des = new CMatrix1[1024];
delete []des;
这样就不会有碎片
lzt20007 2012-09-21
  • 打赏
  • 举报
回复
不是,release也是这样,在别人的电脑上也是这样. delete要比new慢很多,不是一个数量级!

[Quote=引用 13 楼 的回复:]

你不会是在 Debug 版下测试的吧?
Release 它们花的时间相差不会太大的。 Debug 版要做很多事,比如把内存填成 0XCC 之类的。
[/Quote]
www_adintr_com 2012-09-21
  • 打赏
  • 举报
回复
你不会是在 Debug 版下测试的吧?
Release 它们花的时间相差不会太大的。 Debug 版要做很多事,比如把内存填成 0XCC 之类的。
lzt20007 2012-09-21
  • 打赏
  • 举报
回复
我这只是一个测试的例子,模拟实际遇到的情况。惭愧!c++学的确实不好,毕业后就没怎么看过,还是大学的老底..
lzt20007 2012-09-21
  • 打赏
  • 举报
回复
昨天查了下资料,没找到明确的答案,这是自己理解的:
delete的时候,由heap manager负责释放空间,并将释放后的空闲空间填充到邻近的空闲空间,如果发现空闲空间很大,会由virtual manager释放。所以,我觉得是delete之后堆碎片整理导致析构慢。

我先问的是,我理解的对嘛?就像我代码中写的那样,应该是比较常规的写法。你遇到这种情况是怎么写的?

[Quote=引用 9 楼 的回复:]

资料,google就能找到

如果这样组织数据,20w+,以后查找,保存什么的,都会很麻烦。

而且为了16个double,就弄个类,有点亏了。不如264633*double[16]放在一起,在提供几个功能函数,或者功能类。

效率的问题,建议往后放放,目前c++用的不怎么好啊,慢慢来吧,呵呵呵
[/Quote]
lzt20007 2012-09-20
  • 打赏
  • 举报
回复
delete的时候会合并吗?new分配的不是堆上不连续的空间吗?delete直接释放各自空间不就行了吗?还要合并?
我之前从没遇到过这个问题,操作系统有讲这个的?能推荐个书、网络资料吗?

[Quote=引用 5 楼 的回复:]

264632个碎片,del的时候不停的合并,慢很正常,建议找本操作系统看一下,呵呵呵
[/Quote]
majia2011 2012-09-20
  • 打赏
  • 举报
回复
free要比malloc复杂的多,不要自己理解,要么看源码,要么看书
majia2011 2012-09-20
  • 打赏
  • 举报
回复
264632个碎片,del的时候不停的合并,慢很正常,建议找本操作系统看一下,呵呵呵
lzt20007 2012-09-20
  • 打赏
  • 举报
回复
按理说,new 需要申请内存、初始化什么的,应该要慢才对!
而delete只有释放,应该要快很多啊!
这段程序我在好几个电脑中做了实验,都是delete花费时间多,而new几乎不花费时间
lzt20007 2012-09-20
  • 打赏
  • 举报
回复
什么意思?
[Quote=引用 2 楼 的回复:]

既然要成对出现,那么你就别光看其中一步的效率了。
[/Quote]
healer_kx 2012-09-20
  • 打赏
  • 举报
回复
既然要成对出现,那么你就别光看其中一步的效率了。
lzt20007 2012-09-20
  • 打赏
  • 举报
回复
补充:
经测试,new 花费 0s
delete 花费 24s

为什么会出现这种情况呢?delete不应该比new快吗?
5t4rk 2012-09-20
  • 打赏
  • 举报
回复
跟踪delete和new都调用了什么,在底层做了些什么、。


majia2011 2012-09-20
  • 打赏
  • 举报
回复
资料,google就能找到

如果这样组织数据,20w+,以后查找,保存什么的,都会很麻烦。

而且为了16个double,就弄个类,有点亏了。不如264633*double[16]放在一起,在提供几个功能函数,或者功能类。

效率的问题,建议往后放放,目前c++用的不怎么好啊,慢慢来吧,呵呵呵
lzt20007 2012-09-20
  • 打赏
  • 举报
回复
那像这种情况,为了提高速度,是不是该用数组指针?
像这种:
CMatrix1 *pmt2 = new CMatrix1 [264633];
delete []pmt2;
这样确实会提高一些速度,还有其他什么办法吗?


[Quote=引用 6 楼 的回复:]

free要比malloc复杂的多,不要自己理解,要么看源码,要么看书
[/Quote]

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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