2012-08-31 87 views
15

我希望剖析我用Haskell編寫的程序。個人檔案Haskell沒有安裝所有依賴項的安裝分析庫

在編譯時,我被告知我沒有針對某些依賴性(例如criterion)安裝的分析庫以及cabal中止。

我對分析這些依賴關係的部分沒有興趣;從main調用的代碼甚至不使用它們。

如何在不安裝概要分析庫的情況下對我的應用程序進行概要分析我不需要並且不移除所有這些依賴關係?

+0

你不能簡單地安裝它們,什麼問題 –

+5

1)我不需要他們,2)安裝他們是令人難以置信的繁瑣:http://stackoverflow.com/questions/1704421/cabal-not-installing-dependencies-when-needs-profiling-libraries – nh2

+3

儘管我同意這很乏味,但你聲稱你不需要它們,這顯然是錯誤的。 –

回答

12

一個很好的方法來規避編譯一切與分析是使用cabal沙箱。它允許您爲一個應用程序設置沙盒,因此您不必重新安裝整個~/.cabal前綴。你需要最近版本的Cabal,所以先運行cabal update && cabal install cabal-install

一旦你初始化一個沙箱中,創建一個文件cabal.config,包括必要的指令(在你的情況library-profiling: True; executable-profiling: True也可能派上用場。)

這樣做的副作用是,你可以測試你的代碼不需要全局安裝的依賴關係,例如實驗版本或過時版本。

編輯:順便說一句,我不認爲你需要分析啓用criterion工作。無論如何,它適用於我沒有分析被啓用。只需編寫一個包含main = defaultMain benchmarksMain模塊,其中benchmarks的類型爲[Benchmark],即您編寫的基準測試列表。

然後,您將這些文件(比如說,我們把它叫做benchmarks.hsghc --make -o bench benchmarks.hs,並運行程序,./bench使用適當的參數(詳情參閱標準文檔。一個好的默認參數爲,說./bench -o benchmarks.html這將產生一個漂亮的?報告類似this one

+0

我猜'命名規範'是暗示錯誤的事情:它只是我不想分析的依賴項的一個例子。我寧願說* *「我的應用程序使用'hunit'進行測試,但我不希望自己剖析測試代碼,因此希望避免在啓用分析功能的情況下安裝測試代碼」*。 – nh2

+0

這看起來像是一種節省時間的解決方法。 – nh2

+0

如果要比較兩個函數*時間*,則條件僅適用。它沒有告訴你很多*爲什麼*你的代碼是慢/快的。爲了找到內存泄漏或懶惰的thunk,你仍然需要堆分析,這需要'-prof'開關。 –

8

這個星期我有同樣的問題,雖然我已經重新編譯手的一切,我奉命在IRC頻道執行以下操作:

  1. 轉到您的小集團配置文件(in case you don't know where)
  2. 編輯該線使庫概要(和,而你在它,使文檔)
  3. 運行驚天動地安裝世界
6

正如你提到的問題中提及在您的評論中,未來解決此問題的一個好方法是在cabal配置中啓用分析。這樣所有的庫都安裝了分析支持。這可能不是一個令人滿意的解決方案,但我想很多人都選擇它。

如果您只想瞭解程序的內存使用情況,則可以使用-hT生成程序的堆配置文件。更確切地說,您必須編譯程序-rtsopts以啓用RTS選項,然後使用+RTS -hT執行它。編譯器生成一個擴展名爲hp的文件。您可以使用hp2pshp文件轉換爲帶有堆配置文件的postscript文件。這應該沒有任何分析支持,但請注意,我懶得驗證它,因爲我已經安裝了所有支持分析支持的庫; )

+1

已驗證,它是真的。 –

+0

哇,你是對的!堆配置文件不需要'-prof',所以如果我只需要空間剖析就不會出現上述問題。尼斯。 – nh2

+3

請注意,這隻適用於'-hT',即基於類型的堆分析。還有其他的分析類型,如保留器分析,仍然需要'-prof'。 –