在具有8个虚拟核心的计算机上,time .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/test/test +RTS -N1
报告:
real 0m10.368s
user 0m8.592s
sys 0m2.056s
虽然time .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/test/test +RTS -N8
报告:
real 0m15.266s
user 0m40.032s
sys 0m19.880s
要重现:运行stack new partest yesod-simple
,在replicateM_ 500
之后将test/Handler/HomeSpec.hs
添加到describe "Homepage"
,并将ghc-options
中的partest.cabal
设置为-Wall -rtsopts -threaded
这是为什么? ISTM认为这应该从并行性中获益 - 我无法想到线程会争夺的任何资源。 yesod-test
甚至无法启动真实的服务器。从测试中删除文件上传不会对结果产生实质性影响。
这是一个最小化的例子。我最初的问题是在一个更大的应用程序中,似乎传递-N
并不能使测试完全并行运行。所以我的另一个问题是:Yesod中是否存在阻止并行性的东西?一次访问数据库的多个线程会使某些测试无效,但我想自己解决这个问题。 (yesod-simple
模板没有数据库,因此无法解决问题。)