在循环内使用malloc,不同的情况,速度相差10倍!

xuaisi 2012-06-27 01:53:24
代码的情况是这样:



...

RedrawList* redrawListTmp;

startTime = GETTIME();

redrawListTmp = malloc(sizeof(RedrawList));

timeCost_updateRedrawList += ((unsigned long)GETTIME()-startTime);

//打开下面这一行注释后,速度快10倍,和上面一行是一样的
//redrawListTmp = malloc(sizeof(RedrawList));

...




上面的代码是一个循环内的,会执行1999次,就这样运行,得到的数据是(时间单位是CPU时钟周期):

程序渲染一帧需要的总时间:500168504
timeCost_updateRedrawList获取的malloc的累计时间: 227616936

把注释打开后,
总时间:50916024
timeCost_updateRedrawList获取的malloc的累计时间:3929872

可以看到,不论是总的渲染时间还是timeCost_updateRedrawList的值,都有很大的提升,图像渲染也明显快很多。

IDE环境是VC6,使用C,DEBUG模式,单线程。

不知道为什么多malloc一次,速度反而快这么多,大家帮忙分析一下,谢谢!
...全文
3306 61 打赏 收藏 转发到动态 举报
写回复
用AI写文章
61 条回复
切换为时间正序
请发表友善的回复…
发表回复
sada09 2012-07-12
  • 打赏
  • 举报
回复
没得到想要的答案,期望大神继续。
yujie_v 2012-07-07
  • 打赏
  • 举报
回复
学习下,挺多的。
hkcrazyhkcrazy 2012-07-05
  • 打赏
  • 举报
回复
for ( int i = 0 ; i < 2000000 ; ++i )
{
RedrawList* redrawListTmp;
int startTime = GetTickCount();
redrawListTmp = (RedrawList*)malloc(sizeof(RedrawList));
timeCost_updateRedrawList += ((unsigned long)GetTickCount()-startTime);
//redrawListTmp = (RedrawList*)malloc(sizeof(RedrawList));
}
个人猜想:如果有注释,就和正常的一样!如果没有的话 redrawListTmp = (RedrawList*)malloc(sizeof(RedrawList));
初始化了一块内存,然后到RedrawList* redrawListTmp;
开始定义,因为这里只是定义而还没有分配内存,但是编译器用redrawListTmp = (RedrawList*)malloc(sizeof(RedrawList));
这块内存了,所以就节省了很多时间,然后 int startTime = GetTickCount();
这行因为前面分配了,所以就很方便的覆盖,节约了很多时间!

哈哈,这蠢事是个人猜想,大家拍砖吧
最爱吹吹风 2012-07-03
  • 打赏
  • 举报
回复
malloc/free集中释放
ceofit 2012-07-03
  • 打赏
  • 举报
回复
开了编译器优化了?禁用优化试一下。开了优化可能会把你第一个malloc优化掉。具体看你代码了。
看看反汇编就知道了。
ceofit 2012-07-03
  • 打赏
  • 举报
回复
开了编译器优化了?禁用优化试一下。开了优化可能会把你第一个malloc优化掉。具体看你代码了。
看看反汇编就知道了。
Clyce 2012-07-03
  • 打赏
  • 举报
回复
你在循环外面一次全部malloc掉,循环体内指针自增即可
Clyce 2012-07-03
  • 打赏
  • 举报
回复
你在循环体外面把所有内存一次malloc掉,每次循环指针自增即可。
majia2011 2012-07-02
  • 打赏
  • 举报
回复
呵呵呵

我估计,不知道你malloc多大,只能估计,可能是你malloc的内存都不大吧,反复的尝试freelist,导致消耗。

当你malloc(1)时,就快速的将freelist填充好了,这样,新的malloc,也不再去freelist了,也就是这部分的消耗了。

这部分知识在堆管理部分,一般搞溢出攻击的都研究过,比如java的堆攻击。
xuaisi 2012-07-02
  • 打赏
  • 举报
回复
写了线程池测试了,在debug下比使用malloc、free的release还要快。
这个问题,应该是属于特例,程序有2万行代码,可能内存分配刚好处于某个临界点上,在这个状态下频繁的M/F可能会很慢。
当然,这种情况只在debug模式下,而且我用的VC6 SP5,编译器非常古老。

在debug下讨论优化,确实没有意义,结贴吧,谢谢各位。
lihui_huangyuan 2012-07-01
  • 打赏
  • 举报
回复
我觉得可能是这样的:如果把注释掉的malloc打开, 那么第一个 redrawListTmp 被赋值之后没有被使用就失效了,所以被优化掉了。
johnny-huang 2012-06-30
  • 打赏
  • 举报
回复
学习来者
zyb_debug 2012-06-30
  • 打赏
  • 举报
回复
找找身边的同事一起分析,肯定是你程序的问题,这种问题理论上来说不太可能啊。可能你没看出来,你身边的同事也看出来了。这里没环境,代码不全,解决速度慢啊。。
昔成 2012-06-30
  • 打赏
  • 举报
回复
很好奇,继续关注,实践得真理
Tishion 2012-06-29
  • 打赏
  • 举报
回复
请把完整的循环体内的代码贴出来,或者把循环体内与这片内存有关的所有代码贴出来。
rendao0563 2012-06-29
  • 打赏
  • 举报
回复
GETTIME()是什么.
xuaisi 2012-06-28
  • 打赏
  • 举报
回复
[Quote=引用 41 楼 的回复:]

把算时间的那行放到下面的malloc之后看看。时间是不是还是快了?
有可能你在下面加了malloc后,对内存空间的调拨被分到下面的malloc了。
[/Quote]

startTime = GETTIME();
redrawListTmp = malloc(sizeof(RedrawList));
malloc(1);
timeCost_updateRedrawList += ((unsigned long)GETTIME()-startTime);

你好,把malloc(1);的时间也一起算上,debug下时间也快10倍。

我觉得我程序没有bug,因为release下没问题,还是楼上某位兄弟说的好,任何做优化的工作,都应该放到release下来做。

这里的原因应该是malloc和free的逻辑问题,我不准备纠结了,现在统计一下我程序里用到的所有malloc和free,然后开始写个内存池吧。

luciferisnotsatan 2012-06-28
  • 打赏
  • 举报
回复
http://hi.baidu.com/hevensun/item/8b7de2f14e54920fc7dc4564
luciferisnotsatan 2012-06-28
  • 打赏
  • 举报
回复
redrawListTmp = (RedrawList*)malloc(sizeof(RedrawList));
timeCost_updateRedrawList += ((unsigned long)GetTickCount()-startTime);
//redrawListTmp = (RedrawList*)malloc(sizeof(RedrawList));

把算时间的那行放到下面的malloc之后看看。时间是不是还是快了?
有可能你在下面加了malloc后,对内存空间的调拨被分到下面的malloc了。
dinko321 2012-06-28
  • 打赏
  • 举报
回复
[Quote=引用 38 楼 的回复:]

引用楼主 的回复:
代码的情况是这样:

C/C++ code


...

RedrawList* redrawListTmp;

startTime = GETTIME();

redrawListTmp = malloc(sizeof(RedrawList));

timeCost_updateRedrawList += ((unsi……

你的程序存在b……
[/Quote]

作为一个围观者,求高手指教
加载更多回复(40)

679

社区成员

发帖
与我相关
我的任务
社区描述
智能路由器通常具有独立的操作系统,包括OpenWRT、eCos、VxWorks等,可以由用户自行安装各种应用,实现网络和设备的智能化管理。
linuxpython 技术论坛(原bbs)
社区管理员
  • 智能路由器社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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