В настоящее время мне нужно оптимизировать реализацию Scala алгоритма, который слишком медленный. Он реализован функционально, использует только значения (val
) и неизменяемые структуры данных. Я нахожусь в точке, где я уже помнил важные функции (поэтому в моем коде есть несколько изменчивых карт), что сделало мой код вдвое быстрее, и мне интересно, что делать дальше.
Итак, я не ищу общий совет по оптимизации программного обеспечения (например, сначала оптимизируйте свой алгоритм, используйте профилировщик, делайте тесты...), а скорее для рекомендаций Scala -специфического или JVM-оптимизации.
Мой вопрос: где искать первый при попытке оптимизировать код Scala? Каковы общие языковые конструкции или шаблоны, которые обычно вызывают замедление?
В частности, я ищу совет по следующим пунктам:
- Я читал, что конструкции
for(...)
медленны, потому что анонимный класс генерируется каждый раз, когда тело цикла выполняется. Это правда? Есть ли другие места, где генерируется анонимный класс? (например, при использованииmap()
с анонимной функцией) - Являются неизменяемыми коллекциями значительно медленнее, чем изменчивые коллекции в общем (особенно когда речь идет о структурах карт)?
- Существуют ли существенные различия в производительности между Scala 2.8, 2.9 и 2.10?