我正在尝试并行测试 GCC。在给我测试报告之前,我的设置将运行 96 次测试。
如果我按顺序运行这些测试,它将调用 GCC 一次,运行可执行文件,收集诊断信息,然后重复。然而,当我尝试并行运行这些测试时,对 GCC 的调用需要更多时间。
我的探查器告诉我,(对 96 个测试进行平均)在按顺序运行 96 个测试时,对 GCC 的调用占总执行时间的 2%。我的机器有 8 个核心,当我在程序上运行相同的分析器但有 8 个可用线程(每个线程 12 个测试)时,对 GCC 的调用占总时间的 12%。
我推测本例中的操作系统可能是共享资源,并尝试告诉 GCC 将可执行文件输出到 tmpfs 位置,但这只使我在那里花费的总时间减少到 11%。有人可以在这里帮我指导一下吗?我不太熟悉 Linux (Ubuntu 20) 上的文件系统和 IO 写入工作方式。
我不认为我的测试代码一定是错误的,但无论如何我都会包含它。它是用 Haskell 编写的。当测试按顺序运行时,该函数占用所有时间的 2%,但(现在)当测试在 8 个线程上并行运行时(我确实有 8 个可用核心),则占用 11%。
create_test_executable :: String -> State -> String -> IO ()
create_test_executable p s path = do -- p = the c program, s = unused here, path = where to write executable
let process = proc "gcc" ["-xc", "-"]
x@(Just sin, Just sout, Just serr, _) <-
createProcess process { std_in = CreatePipe
, std_err = CreatePipe
, std_out = CreatePipe
, cwd = Just path
}
hPutStr sin p
hFlush sin
hClose sin
o <- hGetContents sout
if o == "" then return () else return () -- force read from output pipe
cleanupProcess x
澄清一下:我怀疑 GCC 会将可执行文件写入磁盘,而这种磁盘 IO 争用导致每个单独的测试速度变慢。我尝试通过将可执行文件写入 tmpfs 位置来解决此问题,但这几乎没有任何区别。对此位置的写入由我作为参数传递给上述函数的路径指定,