2017-02-10 30 views
4

Я пишу шахматный движок как учебный проект. Чтобы решить, что нужно сделать, ему необходимо проанализировать все состояния плат, которые могут быть достигнуты путем выполнения 4 шагов из текущего состояния платы. Это означает, что мне приходится анализировать сотни тысяч плат.Почему объявляется массив с использованием большого количества CPU и как его можно оптимизировать?

Код, по понятным причинам, медленный, поэтому я использовал встроенный профилировщик Netbeans, чтобы увидеть, какую функцию я должен оптимизировать. Я был удивлен, обнаружив, что это просто создание новых массивов в скопированных объектах Board, которые использовали большинство процессоров.

Вот функция, которую он говорит, использует наиболее процессора, в частности init1():

private void initializeFields(Color active) { 
    init1(); 
    init2(active); 
    init3(); 
    init4(); 
} 

private void init1() { 
    //this line appears to be using a ton of CPU 
    pieces = new Piece[SQUARES_PER_SIDE][SQUARES_PER_SIDE]; 
} 

private void init2(Color active) { 
    activePlayer = active; 
} 

private void init3() { 
    moveHistory = new LinkedList<>(); 
} 

private void init4() { 
    possibleMoves = null; 
} 

И здесь результаты профилировщика:

enter image description here

Очевидно, я понимаю, что огромное количество созданных и рассмотренных советов, означает, что какая-то маленькая вещь в классе Board, вероятно, займет большинство CPU. Тем не менее, у меня есть 2 вопроса:

1. Почему объявление массива занимает больше всего процессора с Board?

Я ожидал вычисления перемещения или анализа значения каждого состояния платы, чтобы использовать больше, чем просто создавать массивы. Возможно ли, что я неправильно читаю результаты?

2. Как я могу оптимизировать свою работу в этом случае?

Я понимаю, как оптимизировать алгоритмы, но я не уверен, как оптимизировать объявление массива. Я также не уверен, какую лучшую структуру данных я могу использовать для представления платы 8x8, чем 2-мерный массив.

+1

К сожалению, вы отключили столбец, показывающий, как именно этот метод вызывается. Это время для одного звонка или много звонков? Если много, то сколько? –

+0

@a_horse_with_no_name Я ничего не отрезал ... эта колонка не для меня. Позвольте мне посмотреть, смогу ли я попытаться показать это.Тем не менее, это почти наверняка для многих звонков, так как мы знаем, что сотни профилей будут инициализированы во время профилирования. – nhouser9

+0

Нажмите в правом верхнем углу таблицы результатов, там вы можете выбрать, какие столбцы отображать: http://imgur.com/a/QsRLD –

ответ

2
  1. Почему объявление массива с наиболее CPU чего-либо жгутов совета?

Потому что это propbably почти все, что вы делаете. Поиск свободного места в куче занимает больше времени, чем что-либо еще.

  1. Как я могу оптимизировать свою работу в этом случае?

Держите только одну доску и сделать каждый шаг, проверить его и отменить этот шаг для каждого шага.

Это плохой подход, если вы когда-либо хотите параллелизировать, но он намного быстрее и экономичнее. (хороший вызов @shmosel)

+0

Не очень хорошо для распараллеливания. – shmosel

+0

@shmosel Ничто не мешает вам создавать 16 досок или 96 или любое количество ядер, которые у вас есть. – Kayaman

+0

@ Kayaman Это блокирует каждую ветвь определенной веткой, что означает, что вы теряете возможность кражи работы. – shmosel