我写了一个堆管理器模拟器。我使用了两个列表来保存已分配和空闲块的地址和大小。 我发现以下函数大大降低了我的代码性能,因为我需要分配百万个对象... 这个函数的目的是在堆中找到连续的空闲块并合并它们,但问题是它中存在线性搜索,因此需要很长时间才能完成(超过1小时) 我怎样才能改进它?有什么想法吗?
public void updateFreeList(tuple freeElement)
{
int i=0;
if(freeList.size()> 1)
{
while(i<freeList.size())
{
try{
if((freeList.get(i).getAddress()+freeList.get(i).getSize()) == (freeList.get(i+1).getAddress()))
{
freeList.get(i).setSize(freeList.get(i).getSize() + freeList.get(i+1).getSize());
freeList.remove(i+1);
continue;
}
i++;
}
catch (Exception e)
{
break;
}
}
}
}
答案 0 :(得分:0)
您可以使用以下观察:只有在刚刚释放其中一个块时才能合并两个块。这就是为什么不需要检查整个列表的原因:当您取消分配块并将其返回到空闲块列表时,您只需要检查上一个和下一个块。