Haskell 为什么我的Yesod测试并行进行时会慢得多?
在具有8个虚拟内核的计算机上,Haskell 为什么我的Yesod测试并行进行时会慢得多?,haskell,ghc,yesod,Haskell,Ghc,Yesod,在具有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 real 0m15.266s user 0m40.032s sys 0m19.880s 而time.stack work/dist/x86_64-linux/Cabal-1.22.5.0/build/test
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
real 0m15.266s
user 0m40.032s
sys 0m19.880s
而time.stack work/dist/x86_64-linux/Cabal-1.22.5.0/build/test/test+RTS-N8
报告:
real 0m10.368s
user 0m8.592s
sys 0m2.056s
real 0m15.266s
user 0m40.032s
sys 0m19.880s
要复制:在描述“主页”
之后运行堆叠新partest yessod simple
,将复制项目500
添加到测试/处理程序/HomeSpec.hs
,并在partest.cabal
中将ghc选项设置为-Wall-rtsopts-threaded
为什么会这样?我认为这应该从并行性中获益——我想不出线程会争夺什么资源yesod测试
甚至不会启动真正的服务器。从测试中删除文件上载不会对结果产生实质性影响
这是一个最小化的示例。我最初的问题是在一个更大的应用程序中,通过-N
似乎根本不能使测试并行运行。所以我的另一个问题是:YesSOD中是否存在阻止并行性的东西?多个线程同时访问数据库会使一些测试无效,但我想自己解决这个问题。(简单的模板没有DB,所以这不可能是问题所在。)我对此不太了解,但据我所知,您通常应该只告诉GHC实际内核的数量,而不是超线程虚拟内核的数量。不,我不知道为什么。