堆栈 运行,在 haskell 中进行分析
stack run with profiling in haskell
我试过了运行宁
$ stack build --profile && stack run myexec --rts-options -p
但是我明白了
...
Registering library for mylibrary-0.1.0.1..
Completed 2 action(s).
myexec: the flag -p requires the program to be built with -prof
...
我知道我可以 运行
$ .stack-work/dist/x86_64-linux/Cabal-2.4.0.1/build/myexe/myexe +RTS -p
但是 stack run
有什么意义呢?我不想知道 cabal 的版本和体系结构等(这一切都发生在 makefile 中)。
您使用的命令 stack run
是一个方便的命令,它不仅 运行 二进制文件,而且在此之前构建它。因此,当您 运行 stack build --profile
时,它会使用所有必要的 ghc 标志编译二进制文件,但是当您调用 stack run
时,它会再次编译它,但现在没有所有分析标志。所以有两种方法可以正确地做到这一点:
- 不要运行
stack build
,因为它是多余的:
$ stack --profile run myexec --rts-options -p
- 或使用
+RTS
标志直接调用可执行文件,但确保将 --profile
传递给两个 stack
调用,否则 stack exec
将查找错误二进制文件(即非分析构建)的位置,将无法找到它。
$ stack --profile build
$ stack --profile exec -- myexec +RTS -p
我试过了运行宁
$ stack build --profile && stack run myexec --rts-options -p
但是我明白了
...
Registering library for mylibrary-0.1.0.1..
Completed 2 action(s).
myexec: the flag -p requires the program to be built with -prof
...
我知道我可以 运行
$ .stack-work/dist/x86_64-linux/Cabal-2.4.0.1/build/myexe/myexe +RTS -p
但是 stack run
有什么意义呢?我不想知道 cabal 的版本和体系结构等(这一切都发生在 makefile 中)。
您使用的命令 stack run
是一个方便的命令,它不仅 运行 二进制文件,而且在此之前构建它。因此,当您 运行 stack build --profile
时,它会使用所有必要的 ghc 标志编译二进制文件,但是当您调用 stack run
时,它会再次编译它,但现在没有所有分析标志。所以有两种方法可以正确地做到这一点:
- 不要运行
stack build
,因为它是多余的:
$ stack --profile run myexec --rts-options -p
- 或使用
+RTS
标志直接调用可执行文件,但确保将--profile
传递给两个stack
调用,否则stack exec
将查找错误二进制文件(即非分析构建)的位置,将无法找到它。
$ stack --profile build
$ stack --profile exec -- myexec +RTS -p