Lập trình hàm không tạo ra các chương trình nhanh hơn, như một quy luật chung. Những gì nó làm là để lập trình song song và đồng thời dễ dàng hơn . Có hai chìa khóa chính cho việc này:
- Việc tránh trạng thái đột biến có xu hướng làm giảm số lượng những điều có thể sai trong một chương trình, và thậm chí còn nhiều hơn trong một chương trình đồng thời.
- Việc tránh các nguyên thủy đồng bộ hóa dựa trên bộ nhớ và khóa có lợi cho các khái niệm cấp cao hơn có xu hướng đơn giản hóa đồng bộ hóa giữa các luồng mã.
Một ví dụ tuyệt vời của điểm # 2 là trong Haskell chúng tôi có một sự phân biệt rõ ràng giữa song song xác định so với đồng thời không xác định . Không có lời giải thích nào tốt hơn việc trích dẫn cuốn sách tuyệt vời Lập trình song song và đồng thời của Simon Marlow trong Haskell (trích dẫn từ Chương 1 ):
Một chương trình song song là một chương trình sử dụng nhiều phần cứng tính toán (ví dụ: một số lõi xử lý) để thực hiện tính toán nhanh hơn. Mục đích là đi đến câu trả lời sớm hơn, bằng cách ủy thác các phần khác nhau của tính toán cho các bộ xử lý khác nhau thực thi cùng một lúc.
Ngược lại, concurrency là một kỹ thuật cấu trúc chương trình, trong đó có nhiều luồng điều khiển. Về mặt khái niệm, các luồng điều khiển thực thi trên cùng một lúc; đó là, người dùng thấy tác dụng của chúng xen kẽ. Cho dù họ thực sự thực hiện cùng một lúc hay không là một chi tiết thực hiện; một chương trình đồng thời có thể thực thi trên một bộ xử lý thông qua thực thi xen kẽ hoặc trên nhiều bộ xử lý vật lý.
Ngoài ra, Marlow còn đề cập đến khía cạnh quyết định :
Một sự khác biệt có liên quan là giữa các mô hình lập trình xác định và không xác định . Một mô hình lập trình xác định là một mô hình trong đó mỗi chương trình chỉ có thể cho một kết quả, trong khi đó mô hình lập trình không xác định thừa nhận các chương trình có thể có kết quả khác nhau, tùy thuộc vào một số khía cạnh của việc thực hiện. Các mô hình lập trình đồng thời nhất thiết là không xác định bởi vì chúng phải tương tác với các tác nhân bên ngoài gây ra các sự kiện vào thời điểm không thể đoán trước. Tuy nhiên, Nondeterminism có một số nhược điểm đáng chú ý: Các chương trình trở nên khó khăn hơn đáng kể để kiểm tra và lý do.
Để lập trình song song, chúng tôi muốn sử dụng các mô hình lập trình xác định nếu có thể. Vì mục tiêu chỉ là đi đến câu trả lời nhanh hơn, chúng tôi thà không làm cho chương trình của chúng tôi khó gỡ lỗi hơn trong quá trình. Lập trình song song xác định là tốt nhất của cả hai thế giới: Kiểm tra, gỡ lỗi và lý luận có thể được thực hiện trên chương trình tuần tự, nhưng chương trình chạy nhanh hơn với việc bổ sung thêm bộ xử lý.
Trong Haskell, các tính năng song song và đồng thời được thiết kế xung quanh các khái niệm này. Cụ thể, những ngôn ngữ khác nhóm lại thành một bộ tính năng, Haskell chia thành hai:
- Các tính năng quyết định và thư viện cho song song .
- Các tính năng và thư viện không xác định cho đồng thời .
Nếu bạn chỉ đang cố gắng tăng tốc một tính toán thuần túy, xác định, thì việc có sự song song xác định thường giúp mọi việc dễ dàng hơn nhiều. Thường thì bạn chỉ cần làm một cái gì đó như thế này:
- Viết một hàm tạo ra một danh sách các câu trả lời, mỗi câu trả lời rất tốn kém để tính toán nhưng không phụ thuộc nhiều vào nhau. Đây là Haskell, vì vậy các danh sách lười biếng giá trị của các yếu tố của chúng không thực sự được tính toán cho đến khi người tiêu dùng yêu cầu chúng.
- Sử dụng thư viện Chiến lược để sử dụng song song các phần tử danh sách kết quả của hàm của bạn trên nhiều lõi.
Tôi thực sự đã làm điều này với một trong những chương trình dự án đồ chơi của tôi vài tuần trước . Thật là tầm thường khi song song hóa chương trình, điều quan trọng tôi phải làm là, thực tế, thêm một số mã có nghĩa là "tính toán các yếu tố của danh sách này song song" (dòng 90) và tôi đã tăng được thông lượng gần như tuyến tính trong một số trường hợp thử nghiệm đắt tiền hơn của tôi.
Chương trình của tôi có nhanh hơn nếu tôi sử dụng các tiện ích đa luồng dựa trên khóa thông thường không? Tôi rất nghi ngờ như vậy. Điều gọn gàng trong trường hợp của tôi đã nhận được rất nhiều tiếng vang từ rất ít. và không có rủi ro về điều kiện chủng tộc. Và điều đó, tôi sẽ khẳng định, là cách chính mà lập trình chức năng cho phép bạn viết các chương trình "nhanh hơn".