2013-12-10 3 views
4

Поскольку функциональный код по определению избегает изменчивости, насколько это возможно, можно написать программу с сохранением состояния, разворачивая состояние из предыдущего с течением времени. Итак, я пишу игру в F # исключительно в функциональном стиле, и, конечно, игры, как правило, имеют много и много состояний. Я по существу использую записи для игровых объектов (например, игроков), и я просто сопоставляю все эти состояния, чтобы получить следующее состояние. Это работает очень хорошо. Но, поскольку моя игра становится все сложнее и сложнее, я волнуюсь, что она станет вялой из-за того, что копирует каждое обновление. Мне интересно, как я могу попытаться избежать этих подводных камней в будущем (не так сейчас, так как это пока не очень проблема).Эффективность с функциональной парадигмой

Значит, существуют ли существенные оптимизации в функциональном стиле, которые F # не делает для меня, в частности, связанные с копированием больших фрагментов данных, когда могут быть изменены только небольшие части? Кроме того, есть ли что-то, что F # имеет, что я могу использовать в своих интересах таким же образом?

Еще одна вещь - вот мои две основные проблемы, которые могут быть даже неправдой. Я бы хотел, чтобы они были выпрямлены:

  1. Сбор мусора. Поскольку я в конечном итоге копирую тысячи записей в секунду, должно быть огромное количество генерации объектов, все из которых крайне недолговечны, так как я просто выбрасываю старое состояние. Это кажется вероятной причиной коротких, но едва заметных прыжков в игре каждую секунду или около того.

  2. Является ли F # эффективным при копировании записей со всеми, кроме нескольких полей, обновленных? Если это не так, как я могу улучшить эффективность самостоятельно?

+1

Это очень широкий вопрос. Попытайтесь сосредоточиться на одном вопросе на вопрос (желательно что-то конкретное - попробуйте написать что-то медленное, а затем спросите о том, как писать его быстрее, таким образом у нас есть что-то конкретное, с которым можно работать). – mydogisbox

+1

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

+1

na, не беспокойтесь. основным препятствием для перформанса является понятность. В первом приближении любой понятный код будет быстрее, чем любой другой непонятный код, независимо от того, какой метод используется. конечно, чтобы выжать последний бит сока, и только после правильного измерения таймингов вы должны использовать мутацию, но это должно быть наименьшее из ваших забот. – nicolas

ответ

4

Так есть ли какие-либо значительные оптимизации, используемые в функциональном стиле, что F # не делает для меня, в частности, связанные с копированием больших блоков данных, когда только небольшие участки могут быть изменены?

Действительно ли вы копируете «большие куски данных»?

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

+0

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

+0

@ Жости, прочитайте, что он сказал. Неизменяемые данные разделяются между старой и новой картой (то же самое относится и к спискам), поэтому единственный бит, который не является общим, - это бит, который вы меняете (который не будет использоваться в любом случае). Конечно, есть крайние случаи (например, изменение «неправильного» конца списка). – Benjol

+0

А, я понимаю. Думаю, в этот момент не стоит беспокоиться!:) – Jwosty

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