На этом уроке мы немного порефакторим и добавим очень полезную функцию.
Дата отправки отчёта:
22 мая 2018 г.
Задание выполнено: за
1 час. 30 мин.
Чему научился:
Реализовал проверку на правильность хода перед пересозданием доски. Как это просто оказалось, оказывается! А я пытался проверки делать в дополнительном конструкторе... Позор мне _-_
Зато моё тестирование из предыдущего урока - www.videosharp.info/10080/checking/chess3=1935 - показало странные результаты. (Чтобы не повторять тут стену текста, подробности посмотрите в отчёте по предыдущему уроку).
А по данному уроку, после реализации проверки возможности хода перед пересозданием board для начальной шахматной позиции, без сбора подробной статистики, но после нескольких тестов, можно точно только следующее (чтобы не постить длинную таблицу поверхностного тестирования передам результаты на словах, а подробнее можно на скриншоте посмотреть):
1) Появились сильные колебания производительности на глубинах расчёта ходов 1-3 и без многократных прогонов с вычисление среднего результата сказать определённо ничего нельзя, кроме следующих пунктов: 2) На глубине расчёта 3 стабильно повторяется ускорение расчётов в связках NextMovesLINQ() + YieldValidMoves() (1775ms против 2583ms) и NextMovesLINQ() + YieldValidMovesLINQ() (1815ms против 2327ms). 3) На 2-10% ускорились все варианты расчётов для глубины ходов 4.
Выводы: 1) Для собственно проверки возможности хода в данном проекте значительной разницы при избавлении от лишних пересозданий board нет - скорость расчёта сильно скачет и явно в большей мере зависит от внешних факторов (сборщик мусора, троттлинг процессора и т.п.), а для проверки возможности хода фигурой глубина расчёта больше 1 не требуется. 2) Обращает внимание значительное ускорение расчётов для глубины 3 - 30-40%. Возможно есть какой-то sweet spot в количестве создаваемых объектов и вычислений над ними конкретно для LINQ. 3) Многопоточные вычисления продолжают лидировать для глубины расчёта 4, а вот про глубину 1-3 сказать определённо уже ничего нельзя - слишком сильные колебания результатов в каждом прогоне теста. 4) В любом случае для глубины вычислений 4 избавление от лишних board сказывается благотворно.
Это всё выводы для начальной шахматной позиции без сделанных ходов. Для других позиций результаты могут отличаться. К следующему финальному уроку постараюсь сделать более подробное тестирование с вычислением средних результатов :)
Научился: Мне кажется, что красивее и понятнее было бы назвать метод "ХодНеВалиден" и инвертировать логику. Если ход не сделать или после хода будет шах - значит ХодНеВалиден, значит return this.