Я где-то читал, что функциональное программирование подходит для использования преимуществ многоядерных вычислений ... Я не совсем понял эту идею. Это связано с лямбда-исчислением и архитектурой фон Неймана?
Аргумент, на котором основано ваше мнение, заключается в том, что чисто функциональное программирование контролирует побочные эффекты, что делает намного проще и безопаснее вводить параллелизм, и, следовательно, чисто функциональные языки программирования должны иметь преимущества в контексте многоядерных компьютеров.
К сожалению, эта вера давно опровергнута по нескольким причинам:
Абсолютная производительность чисто функциональных структур данных низкая . Так что чисто функциональное программирование - это большой начальный шаг в неверном направлении в контексте производительности (что является единственной целью параллельного программирования).
Чисто функциональные структуры данных плохо масштабируются, потому что они нагружают общие ресурсы, включая распределитель / ГХ и полосу пропускания основной памяти. Таким образом, распараллеленные чисто функциональные программы часто получают низкое ускорение при увеличении количества ядер.
Чисто функциональное программирование делает производительность непредсказуемой. Таким образом, реальные чисто функциональные программы часто видят снижение производительности при распараллеливании, потому что гранулярность фактически случайна.
Например, ненастоящая двухстрочная быстрая сортировка , часто цитируемая сообществом Haskell, обычно работает в тысячи раз медленнее, чем реальная быстрая сортировка на месте, написанная на более традиционном языке, таком как F #. Более того, хотя вы можете легко распараллелить элегантную программу на Haskell, вы вряд ли увидите какое-либо улучшение производительности, поскольку все ненужное копирование делает одно ядро насыщенным по всей полосе пропускания основной памяти многоядерной машины, делая параллелизм бесполезным. На самом деле, никому никогда не удавалось написать какой-либо общий параллельный вид в Haskell, который был бы конкурентоспособен. Самые современные виды, предоставляемые стандартной библиотекой Haskell, обычно в сотни раз медленнее, чем обычные альтернативы.
Однако более распространенное определение функционального программирования как стиля, в котором подчеркивается использование первоклассных функций, действительно оказывается очень полезным в контексте многоядерного программирования, поскольку эта парадигма идеальна для разложения параллельных программ. Например, см. Новую функцию высшего порядка Parallel.For
из пространства имен System.Threading.Tasks
в .NET 4.