Я написал симулятор менеджера кучи. Я использовал два списка, чтобы сохранить адрес и размер выделенных и свободных блоков. Я обнаружил, что следующая функция резко ухудшает мою производительность кода, так как мне нужно выделить миллион объектов ... Цель этой функции - найти непрерывный свободный блок в куче и объединить их, но проблема в том, что в нем есть линейный поиск и в результате это занимает много времени (более 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;
}
}
}
}
Но это в списке, поэтому мне нужно пройти через freeList, чтобы найти предыдущий и следующий блок. Например, в freeList у меня есть (50,50) (300,100) (700,100) (1000,200) и вы хотите освободить (100,200), поэтому мне нужно пройти через FreeList, чтобы найти следующий и предыдущий. Итак, есть ли линейный поиск? Я прав? – Alex
@ user2942756 Если вы не поддерживаете какую-либо дополнительную структуру данных для ускорения поиска, она является линейной. Однако, если наличие дополнительного логарифмического коэффициента для каждой операции возможно, вы можете поддерживать «TreeSet» блоков, чтобы вы могли найти следующий и предыдущий в «O (log N)» времени. – kraskevich