Tất nhiên nó phụ thuộc vào trình biên dịch và các tùy chọn được chuyển đến trình biên dịch.
Ví dụ cụ thể này, nếu bạn biên dịch mà không cần tối ưu hóa, GHC sẽ tạo mã như bạn đã viết, vì vậy phiên bản thứ hai chứa một cuộc gọi đến id
resp. đến not
. Đó là hơi kém hiệu quả hơn so với phiên bản đầu tiên, sau đó chỉ chứa các cuộc gọi đến not
:
Xors.xor1 :: GHC.Types.Bool -> GHC.Types.Bool -> GHC.Types.Bool
[GblId, Arity=2]
Xors.xor1 =
\ (ds_dkm :: GHC.Types.Bool) (x_aeI :: GHC.Types.Bool) ->
case ds_dkm of _ {
GHC.Types.False -> x_aeI;
GHC.Types.True -> GHC.Classes.not x_aeI
}
Xors.xor2 :: GHC.Types.Bool -> GHC.Types.Bool -> GHC.Types.Bool
[GblId, Arity=1]
Xors.xor2 =
\ (ds_dki :: GHC.Types.Bool) ->
case ds_dki of _ {
GHC.Types.False -> GHC.Base.id @ GHC.Types.Bool;
GHC.Types.True -> GHC.Classes.not
}
(các cuộc gọi vẫn nằm trong lắp ráp sản xuất, nhưng cốt lõi là dễ đọc hơn, vì vậy tôi chỉ đăng bài).
Nhưng với optimisations, cả hai chức năng biên dịch để cùng một lõi (và từ đó đến mã cùng một máy),
Xors.xor2 =
\ (ds_dkf :: GHC.Types.Bool) (eta_B1 :: GHC.Types.Bool) ->
case ds_dkf of _ {
GHC.Types.False -> eta_B1;
GHC.Types.True ->
case eta_B1 of _ {
GHC.Types.False -> GHC.Types.True;
GHC.Types.True -> GHC.Types.False
}
}
GHC eta-mở rộng phiên bản thứ hai và inlined các cuộc gọi đến id
và not
, bạn sẽ có được phù hợp với mô hình thuần túy.
Phương trình thứ hai sử dụng False
hoặc ký tự đại diện không có sự khác biệt trong cả hai phiên bản, có hoặc không có tối ưu hóa.
có thể trình biên dịch tối ưu hóa cuộc gọi bổ sung này.
Nếu bạn yêu cầu tối ưu hóa, trong những trường hợp đơn giản như thế này, GHC sẽ loại bỏ cuộc gọi thêm.
hãy tưởng tượng nó là một chức năng không tầm thường.
Đây là vấn đề có thể xảy ra. Nếu mã này không đủ tầm thường, trình biên dịch có thể không thể loại bỏ tất cả các cuộc gọi được giới thiệu bằng cách định nghĩa hàm không phải tất cả các đối số được cung cấp.Mặc dù vậy, GHC khá tốt trong việc thực hiện điều đó và vì vậy bạn cần một số lượng không đáng kể để GHC không loại bỏ các lời gọi đến các hàm đơn giản mà nó biết khi biên dịch mã của bạn. 't biết việc thực hiện khi biên dịch các mô-đun trong câu hỏi).
Nếu mã quan trọng, luôn kiểm tra mã trình biên dịch tạo ra, đối với GHC, các cờ có liên quan là -ddump-simpl
để lấy lõi được tạo sau khi tối ưu hóa và -ddump-asm
để có được cụm được sản xuất.
S o cuối cùng họ là như nhau ... Cảm ơn cho cuộc biểu tình rõ ràng này (và cho GHC lời khuyên, rất hữu ích) – niahoo