9

Tôi đang viết một mô-đun dựa vào tối ưu hóa. Tôi muốn thử nghiệm mô-đun này trong ghci. Nhưng bắt đầu ghc ở chế độ --interactive sẽ tự động vô hiệu hóa tối ưu hóa; nếu tôi biên dịch mô-đun với -O và sau đó cố gắng tải mô-đun đó trong phiên tương tác, ghc nhấn mạnh việc tải mô-đun đó ở chế độ diễn giải.Tôi làm cách nào để tải mã được tối ưu hóa trong GHCI?

Đối với một trường hợp thử nghiệm đơn giản để phân biệt các module tối ưu hóa và được tối ưu hóa, isOptimized dưới đây để đánh giá True với tối ưu hóa, nhưng False với tối ưu hóa off:

isOptimized :: Bool 
isOptimized = g 

g :: Bool 
g = False 

{-# NOINLINE g #-} 
{-# RULES "g/True" g = True #-} 

Trả lời

12

Hoặc sử dụng ghci -fobject-code -O Test.hs hoặc cabal repl --ghc-options="-fobject-code -O". Cụ thể hơn:

  1. ghci phải được gọi với -fobject-code flag.

  2. Cờ tối ưu hóa phải được cấp sautrên dòng lệnh hoặc trong một OPTIONS_GHC pragma ở đầu mô-đun. Đang thử ghc --interactive -O -fobject-code tạo ra cảnh báo rằng "-O xung đột với --interactive; -O bị bỏ qua". Đây có lẽ là một lỗi.

  3. Nếu bạn đang làm việc trên một dự án cabalized và sử dụng cabal repl, bạn cần phải vượt qua các cờ hoặc trên dòng lệnh (ví dụ: cabal repl --ghc-options="-fobject-code -O") hoặc trong một pragma. Cabal (hiện tại) loại bỏ các cờ tối ưu được đặt trong tệp .cabal với ghc-options khi gọi ghci; trên thực tế, nó đặt rõ ràng -O0 thay thế. Đây có lẽ là một lỗi.

Lưu ý trong bất kỳ trường hợp đó bạn đôi khi cần phải biên dịch lại buộc thủ công khi chuyển đổi giữa các chế độ tối ưu hóa và được tối ưu hóa. Xây dựng các tạo phẩm, vì một số lý do, không bị vô hiệu khi cờ tối ưu hóa thay đổi miễn là -fobject-code vẫn tiếp tục. Nếu, bắt đầu từ một slate sạch, bạn có -fobject-code được đặt trong tệp .cabal của bạn, chạy cabal repl để biên dịch mô-đun, và sau đó nhớ bạn cần đặt -O trên dòng lệnh và chạy cabal repl --ghc-options=-O, ghc sẽ vui lòng tải trước đó được biên dịch , mô-đun chưa được tối ưu hóa. Đây cũng có lẽ là một lỗi.

Kịch bản đáng tin cậy nhất để thử nghiệm một mô-đun đơn có vẻ là đặt {-# OPTIONS_GHC -fobject-code -O #-} ở đầu mô-đun. Bạn sẽ nhận được mã tối ưu cho dù bạn gọi ghci như thế nào. Tôi đã không điều tra những gì xảy ra trong các tình huống đa mô-đun trong đó một số nhưng không phải tất cả các mô-đun đều có pragma.

Ngẫu nhiên, lưu ý rằng chỉ mã trong mô-đun được tối ưu hóa. Ngay cả khi tối ưu hóa, việc đánh giá g trong repl sẽ luôn sản xuất False, vì đầu vào thay thế không phải tuân theo các quy tắc viết lại.

+0

Vì vậy, có vẻ như với tôi điều này có thể là một cách để thực sự chức năng thời gian và đo lường hiệu suất biểu diễn thông qua GHCi. Bạn hoặc bất kỳ ai có thể chấp nhận hoặc từ chối không? – MasterMastic

+0

@ChristianConkle bạn đã xem chủ đề này chưa? http://stackoverflow.com/questions/27541609/difference-in-performance-of-compiled-accelerate-code-ran-from-ghci-and-shell –

+0

@WojciechDanilo - Có. Tôi vừa đăng bình luận ở đó. (Tôi không nghĩ rằng tôi có thể @ thông báo cho bạn trong chủ đề đó vì bạn chưa nhận xét.) –

Các vấn đề liên quan