大侠们,帮帮忙,分析分析这段代码, :)

Debug_Today 2010-06-14 11:58:08
int small_push(small_piece **freed, small_piece ***used, void *ptr1, size_t size1)
{
small_piece *piece;
if ((*freed) == 0)
return 0;
piece = (*freed);
(*freed) = (*freed)->next;
piece->next = (*used)[size1];
piece->block = ptr1;
(*used)[size1] = piece;
return 1;
}

void *small_pop(handle_mm *mm, size_t size)
{
small_piece *piece;
if (mm->small->cache[size] == 0)
return 0;
piece = mm->small->cache[size];
mm->small->cache[size] = mm->small->cache[size]->next;
piece->next = mm->small->piece_pck;
mm->small->piece_pck = piece;
return piece->block;
}

为什么两次,数量级(100万),调用的效率不同?

以下是初始化链表生成代码如下:
//Build Link List
small->piece_pck = &small->piece_pck_s[0];
small->piece_pck->next = 0;
for (i = 1; i<total_pck; i++)
{
piece = &small->piece_pck_s[i];
piece->next = small->piece_pck;
small->piece_pck = piece;
}
第一次调用,是最快的, 耗时在 0.015 ms, 第二次完全一样的调用, 耗时在 0.030 ms左右, 第三次,比第二次快了一点,但是没有第一次快。
我把链表复原,即重新Build之后,效率又同第一次一样, 内存地址读取的时间为什么会变化?明明操作全部一样,效率缺变化了,现在可以排除操作系统的碎片因素,我尝试过汇编,但是直接的感觉不是代码的效率, 请各位大侠帮忙分析分析,问题在哪儿?

...全文
193 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Debug_Today 2010-06-14
  • 打赏
  • 举报
回复
你好,非常感谢你的回复!
我是通过统计全部的时间,然后求平均的(timeGetTime), 如果是系统波动的话, 那么不应该这么有规律才是, 现在执行很有规律,就是第二次慢, 当然重新BuildLinkList,那么第二次的效率和第一次一样。
wuyu637 2010-06-14
  • 打赏
  • 举报
回复
你是怎么统计时间的?

0.015ms和0.030ms的误差 完全会被系统的时间波动覆盖
Debug_Today 2010-06-14
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 cattycat 的回复:]
怎么整这么多的指针,其实指针寻址也会跨页的,会造成内存抖动的。你说的排除碎片不对吧,这个执行的时候还是不确定的。
[/Quote]
你好,我的内存不是实时释放和申请的,是固定在那里的,如果是碎片的原因,那为啥RebuildLinkList后,效率会一样?RebuildLinkList实质不是释放和申请,而是重新赋值而已。 而且如果不用指针,那么很难以实现功能了啊?“针寻址也会跨页”我去检查一下去。
cattycat 2010-06-14
  • 打赏
  • 举报
回复
怎么整这么多的指针,其实指针寻址也会跨页的,会造成内存抖动的。你说的排除碎片不对吧,这个执行的时候还是不确定的。
Debug_Today 2010-06-14
  • 打赏
  • 举报
回复
没人解决我的问题吗? 我可以在追加198分啊。。。。。。
Debug_Today 2010-06-14
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 qifeifei 的回复:]
我以前也想过类似的问题,系统计算的速度应该也有波动吧,没有深入去研究它。
[/Quote]

但是每次计算都是这样子呢? 如果是波动, 那么应该是不定的。
按照我预想的结果,应该是第二次执行效率高于第一次执行效率, 但是实际是这样, 太纳闷了。。
东莞某某某 2010-06-14
  • 打赏
  • 举报
回复
换个环境试试
qifeifei 2010-06-14
  • 打赏
  • 举报
回复
我以前也想过类似的问题,系统计算的速度应该也有波动吧,没有深入去研究它。
gushuiyue09 2010-06-14
  • 打赏
  • 举报
回复
深奥 学习了
Debug_Today 2010-06-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zhaiershuaixu 的回复:]
二级,三级指针,有些晕!
[/Quote]

你好,感谢你的回复。

我也是试过一级指针,但是结果不会太大的变化,那种波动暂且可以忽视,总体趋势还是那样子, 第一次快,第二次慢。。。。。 晕啊, 我不知道怎么回事啊, 换过多种代码。。。。。 是MS的问题吗?。。。 谁来99我啊。。
Debug_Today 2010-06-14
  • 打赏
  • 举报
回复
Clear时间统计
float TiXmlNode::Clear()
{
TiXmlNode* node = firstChild;
TiXmlNode* temp = 0;
float cost = 0;
DWORD dwBegin, dwEnd;
DWORD i = 0;

while ( node )
{
temp = node;
node = node->next;
dwBegin = timeGetTime();
SmallPush(temp);
dwEnd = timeGetTime();
cost += (dwEnd - dwBegin);
i++;
}
cost /= i;

firstChild = 0;
lastChild = 0;

return cost;
}

以下是Release版本中main 测试代码
small_push_ref = 0;
small_pop_ref = 0;
//----------------------------------------------------------------------//
TiXmlDocument *doc = new TiXmlDocument;
dwBegin = timeGetTime();
doc->LoadFile("1.data");
dwEnd = timeGetTime();
printf("XML Load Finished! %u ms\n", dwEnd - dwBegin);
printf("Clear XML AdverCost %f ms\n", doc->Clear());
delete doc;
printf("Push %d Pop %d\n", small_push_ref, small_pop_ref);

//RebuildLinkList
//HEAP_ClearSmallCache(mAppHeap);

small_push_ref = 0;
small_pop_ref = 0;
doc = new TiXmlDocument;
dwBegin = timeGetTime();
doc->LoadFile("1.data");
dwEnd = timeGetTime();
printf("XML Load Finished! %u ms\n", dwEnd - dwBegin);
printf("Clear XML AdverCost %f ms\n", doc->Clear());
delete doc;
//----------------------------------------------------------------------//
printf("Push %d Pop %d\n", small_push_ref, small_pop_ref);
zhaiershuaixu 2010-06-14
  • 打赏
  • 举报
回复
二级,三级指针,有些晕!
Debug_Today 2010-06-14
  • 打赏
  • 举报
回复
Load 对应着 Pop, 当然也会使用少量的Push
Clear 对应着 Push(只有这个)


图中有Push和Pop的计数,可以看出,Push的数目是一致的, 但是Push为什么会速度下降?

以下是 第一次Load/Clear 之后, RebuildLinkList 后, 第二次Load/Clear
Debug_Today 2010-06-14
  • 打赏
  • 举报
回复


如图中所示。

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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