Я пишу шахматный движок как учебный проект. Чтобы решить, что нужно сделать, ему необходимо проанализировать все состояния плат, которые могут быть достигнуты путем выполнения 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;
}
И здесь результаты профилировщика:
Очевидно, я понимаю, что огромное количество созданных и рассмотренных советов, означает, что какая-то маленькая вещь в классе Board
, вероятно, займет большинство CPU. Тем не менее, у меня есть 2 вопроса:
1. Почему объявление массива занимает больше всего процессора с Board
?
Я ожидал вычисления перемещения или анализа значения каждого состояния платы, чтобы использовать больше, чем просто создавать массивы. Возможно ли, что я неправильно читаю результаты?
2. Как я могу оптимизировать свою работу в этом случае?
Я понимаю, как оптимизировать алгоритмы, но я не уверен, как оптимизировать объявление массива. Я также не уверен, какую лучшую структуру данных я могу использовать для представления платы 8x8, чем 2-мерный массив.
К сожалению, вы отключили столбец, показывающий, как именно этот метод вызывается. Это время для одного звонка или много звонков? Если много, то сколько? –
@a_horse_with_no_name Я ничего не отрезал ... эта колонка не для меня. Позвольте мне посмотреть, смогу ли я попытаться показать это.Тем не менее, это почти наверняка для многих звонков, так как мы знаем, что сотни профилей будут инициализированы во время профилирования. – nhouser9
Нажмите в правом верхнем углу таблицы результатов, там вы можете выбрать, какие столбцы отображать: http://imgur.com/a/QsRLD –