함수형 프로그래밍은 일반적으로 더 빠른 프로그램을 만들지 않습니다. 무엇을 만드는 것은입니다 쉽게 병렬 및 동시 프로그래밍. 여기에는 두 가지 주요 키가 있습니다.
- 변경 가능한 상태를 피하면 프로그램에서 잘못 될 수있는 일의 수가 줄어드는 경향이 있으며, 동시 프로그램에서는 더 많은 일이 발생합니다.
- 높은 수준의 개념을 선호하는 공유 메모리 및 잠금 기반 동기화 프리미티브를 피하면 코드 스레드 간의 동기화가 단순화됩니다.
포인트 # 2의 한 가지 훌륭한 예는 Haskell에서 결정 론적 병렬성 과 비결정론 적 동시성 사이에 분명한 차이점이 있다는 것입니다 . 하스켈에서 Simon Marlow의 훌륭한 책 Parallel and Concurrent Programming을 인용하는 것보다 더 나은 설명은 없습니다 (견적은 1 장 에서 왔습니다 ).
병렬 프로그램을 더 빨리 계산을 수행하는 컴퓨팅 하드웨어 (예를 들어, 여러 개의 프로세서 코어) 다수의 사용이다. 목표는 계산의 다른 부분을 동시에 실행되는 다른 프로세서로 위임하여 더 일찍 답에 도달하는 것입니다.
대조적으로, 동시성 은 다중 제어 스레드가있는 프로그램 구조화 기술입니다. 개념적으로, 제어 스레드는 "동시"실행됩니다. 즉, 사용자는 자신의 효과가 인터리브 된 것을 볼 수 있습니다. 이들이 실제로 동시에 실행되는지 여부는 구현 세부 사항입니다. 동시 프로그램은 인터리브 된 실행 또는 여러 물리적 프로세서를 통해 단일 프로세서에서 실행될 수 있습니다.
이 외에도 Marlow 언급은 결정론 의 차원을 제시합니다 .
결정 론적 프로그래밍 모델 과 비결정론 적 프로그래밍 모델 사이의 관련 차이점이 있습니다. 결정 론적 프로그래밍 모델은 각 프로그램이 하나의 결과 만 제공 할 수있는 모델이지만 비결정론 적 프로그래밍 모델은 실행의 일부 측면에 따라 다른 결과를 가질 수있는 프로그램을 허용합니다. 동시 프로그래밍 모델은 예측할 수없는 시간에 이벤트를 발생시키는 외부 에이전트와 상호 작용해야하므로 반드시 비 결정적입니다. 그러나 비결정론에는 다음과 같은 몇 가지 단점이 있습니다. 프로그램을 테스트하고 추론하기가 상당히 어려워집니다.
병렬 프로그래밍의 경우 가능한 경우 결정적 프로그래밍 모델을 사용하려고합니다. 목표는 응답에 더 빨리 도달하는 것이므로 프로세스에서 프로그램을 디버그하기 어렵게 만들지는 않습니다. 결정적 병렬 프로그래밍은 두 가지 측면에서 최고입니다. 테스트, 디버깅 및 추론은 순차적 프로그램에서 수행 될 수 있지만 프로세서를 추가하면 프로그램이 더 빨리 실행됩니다.
Haskell에서 병렬 처리 및 동시성 기능은 이러한 개념을 중심으로 설계되었습니다. 특히 다른 언어가 하나의 기능 세트로 그룹화되어있는 Haskell은 두 가지로 나뉩니다.
- 병렬 처리를 위한 결정적 기능 및 라이브러리 .
- 동시성을 위한 비 결정적 기능 및 라이브러리 .
순수하고 결정론적인 계산 속도를 높이려는 경우 결정적 병렬 처리를 사용하면 작업이 훨씬 쉬워집니다. 종종 다음과 같은 작업을 수행합니다.
- 답변 목록을 생성하는 함수를 작성하십시오. 각 목록은 계산 비용이 많이 들지만 서로 크게 의존하지는 않습니다. 이것은 Haskell이므로 목록은 게으르다 . 소비자가 요구할 때까지 요소의 값은 실제로 계산되지 않는다.
- 사용 전략 여러 코어에서 병렬로 함수의 결과 목록 '요소를 소비하는 라이브러리를.
실제로 몇 주 전에 내 장난감 프로젝트 프로그램 중 하나를 사용하여이 작업을 수행했습니다 . 프로그램을 병렬화하는 것은 사소한 일이었습니다. 실제로 내가해야 할 핵심은 "이 목록의 요소를 병렬로 계산"(라인 90)이라는 코드를 추가하는 것입니다. 더 비싼 테스트 사례 중 일부.
기존의 잠금 기반 멀티 스레딩 유틸리티를 사용했을 때보 다 프로그램이 더 빠릅니까? 나는 너무 의심합니다. 필자의 경우 깔끔한 점은 너무 적은 비용으로 너무 많이 나가는 것이 었습니다. 내 코드는 아마도 차선책 일 것입니다.하지만 병렬화가 너무 쉬워서 적절히 프로파일 링하고 최적화하는 것보다 훨씬 적은 노력으로 큰 속도를 얻었습니다. 경쟁 조건의 위험이 없습니다. 그리고 기능 프로그래밍이 "더 빠른"프로그램을 작성하는 주된 방법이라고 주장합니다.