2012-08-31 41 views
15

Tôi muốn hồ sơ chương trình của tôi được viết bằng Haskell.Hồ sơ Haskell mà không cần cài đặt cài đặt thư viện hồ sơ cho tất cả các phụ thuộc

Khi biên soạn, tôi được thông báo rằng tôi không có thư viện hồ sơ cho các phụ thuộc nhất định (ví dụ: criterion) đã cài đặt và cabal hủy.

Tôi không quan tâm đến việc lập cấu hình các phần của những phụ thuộc đó; mã được gọi từ main thậm chí không sử dụng chúng.

Làm cách nào để tôi có thể hồ sơ ứng dụng của mình mà không cần cài đặt thư viện lược tả mà tôi không cần và không xóa tất cả các phụ thuộc đó?

+0

Bạn không thể. Chỉ cần cài đặt chúng, vấn đề là gì? –

+5

1) Tôi không cần chúng, 2) Cài đặt chúng cực kỳ tẻ nhạt: http://stackoverflow.com/questions/1704421/cabal-not-install-dependencies-khi-cần-profiling-thư viện – nh2

+3

Trong khi tôi đồng ý rằng nó tẻ nhạt, yêu cầu của bạn mà bạn không cần chúng rõ ràng là sai. –

Trả lời

12

Một cách hay để vượt qua việc phải biên dịch mọi thứ với lược tả là sử dụng hộp cát cabal. Nó cho phép bạn thiết lập một sandbox cho một ứng dụng duy nhất, và do đó bạn sẽ không phải cài đặt lại toàn bộ tiền tố ~/.cabal của mình. Bạn sẽ cần một phiên bản Cabal gần đây, vì vậy hãy chạy trước tiên cabal update && cabal install cabal-install.

Khi bạn khởi tạo một sandbox, tạo một tệp cabal.config để bao gồm các chỉ thị cần thiết (trong trường hợp của bạn library-profiling: True; executable-profiling: True cũng có thể có ích.)

Một tác dụng phụ của việc này là bạn có thể kiểm tra mã của bạn với các phụ thuộc không cần cài đặt trên toàn cầu, ví dụ như các phiên bản thử nghiệm hoặc các phiên bản lỗi thời.

EDIT: btw, tôi không nghĩ bạn cần bật hồ sơ cho criterion để hoạt động. Trong mọi trường hợp, nó hoạt động cho tôi mà không cần kích hoạt tính năng hồ sơ. Chỉ cần viết mô-đun Main có chứa main = defaultMain benchmarks trong đó benchmarks có loại [Benchmark], nghĩa là danh sách các điểm chuẩn mà bạn đã viết.

Sau đó bạn biên dịch tập tin đó (chẳng hạn, chúng tôi gọi nó benchmarks.hs với ghc --make -o bench benchmarks.hs, và chạy chương trình, ./bench với các đối số thích hợp (tham khảo tài liệu tiêu chuẩn để biết chi tiết. Một đối số mặc định tốt là, nói ./bench -o benchmarks.html mà sẽ tạo ra một tiện lợi báo cáo tương tự như this one)

+0

Tôi đoán đặt tên 'tiêu chí' là ngụ ý điều sai trái: đó chỉ là một ví dụ về sự phụ thuộc mà tôi không muốn hồ sơ. Thay vào đó, tôi nên nói điều gì đó như * "Ứng dụng của tôi sử dụng' hunit' để thử nghiệm, nhưng tôi không muốn tự mình biên tập mã thử nghiệm và có muốn tránh cài đặt với cấu hình được kích hoạt "*. – nh2

+0

Điều này giống như giải pháp tiết kiệm thời gian trong thời gian này. – nh2

+0

Tiêu chí chỉ tốt nếu bạn muốn so sánh hai chức năng * theo thời gian *. Nó không cho bạn biết nhiều về * tại sao * mã của bạn chậm/nhanh. Để tìm rò rỉ bộ nhớ hoặc các khối lười, bạn vẫn sẽ cần hồ sơ heap, cần chuyển đổi '-prof'. –

8

tôi đã cùng một vấn đề trong tuần này, và mặc dù tôi đã biên dịch lại tất cả mọi thứ bằng tay, tôi đã hướng dẫn trong các kênh IRC phải làm như sau:

  1. Đến cabal tập tin cấu hình của bạn (in case you don't know where)
  2. Sửa dòng cho phép hồ sơ thư viện (và trong khi bạn đang ở đó, cho phép tài liệu)
  3. Run Cabal Install thế giới
6

Như đã đề cập trong câu hỏi bạn tham khảo trong nhận xét của bạn, một cách hay để giải quyết vấn đề này trong tương lai là kích hoạt cấu hình trong cấu hình cabal. Bằng cách này tất cả các thư viện được cài đặt với sự hỗ trợ lược tả. Đây có thể không phải là một giải pháp thỏa mãn nhưng tôi đoán nhiều người đang chọn nó.

Nếu bạn chỉ muốn có ấn tượng về việc sử dụng bộ nhớ của chương trình, bạn có thể tạo hồ sơ heap của chương trình bằng cách sử dụng -hT. Chính xác hơn, bạn phải biên dịch chương trình với -rtsopts để bật các tùy chọn RTS sau đó thực thi nó bằng cách sử dụng +RTS -hT. Trình biên dịch tạo ra một tập tin với phần mở rộng hp. Bạn có thể chuyển đổi tệp hp thành tệp postscript có hồ sơ heap bằng cách sử dụng hp2ps. Điều này sẽ làm việc mà không có bất kỳ hỗ trợ profiling, nhưng lưu ý rằng tôi lười biếng để xác minh nó như tôi đã cài đặt tất cả các thư viện với hỗ trợ profiling;)

+1

Xác minh nó, đó là sự thật. –

+0

Wow, bạn đã đúng! Hồ sơ heap không cần '-prof', do đó, vấn đề trên của tôi không phát sinh nếu tôi chỉ cần không gian profiling. Tốt đẹp. – nh2

+3

Xin lưu ý rằng đây chỉ là trường hợp của '-hT', đó là định dạng đống dựa trên kiểu. Có các loại lược tả khác như hồ sơ lưu giữ mà vẫn cần '-prof'. –

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