2014-10-18 12 views
0

Я написал симулятор менеджера кучи. Я использовал два списка, чтобы сохранить адрес и размер выделенных и свободных блоков. Я обнаружил, что следующая функция резко ухудшает мою производительность кода, так как мне нужно выделить миллион объектов ... Цель этой функции - найти непрерывный свободный блок в куче и объединить их, но проблема в том, что в нем есть линейный поиск и в результате это занимает много времени (более 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

Но это в списке, поэтому мне нужно пройти через freeList, чтобы найти предыдущий и следующий блок. Например, в freeList у меня есть (50,50) (300,100) (700,100) (1000,200) и вы хотите освободить (100,200), поэтому мне нужно пройти через FreeList, чтобы найти следующий и предыдущий. Итак, есть ли линейный поиск? Я прав? – Alex

+0

@ user2942756 Если вы не поддерживаете какую-либо дополнительную структуру данных для ускорения поиска, она является линейной. Однако, если наличие дополнительного логарифмического коэффициента для каждой операции возможно, вы можете поддерживать «TreeSet» блоков, чтобы вы могли найти следующий и предыдущий в «O (log N)» времени. – kraskevich

Смежные вопросы