GCCを並列にテストしようとしています。私の設定では、テストレポートを提供する前に96のテストを実行します。
これらのテストを順番に実行すると、GCCを一度呼び出し、実行可能ファイルを実行し、診断を収集して繰り返します。ただし、これらのテストを並列に実行しようとすると、GCC呼び出しに時間がかかります。
私のプロファイラによると(平均96を超えるテスト)、96のテストを順番に実行すると、GCC呼び出しは全体の実行時間の2%を占めます。私のコンピュータには8つのコアがあり、プログラムで同じプロファイラを実行するときに8つのスレッドを使用できますが(スレッドあたり12のテスト)、GCC呼び出しは合計時間の12%を占めます。
この場合、OSが共有リソースである可能性があると推測し、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の場所に作成してこの問題を解決しようとしましたが、ほとんど違いはありませんでした。この位置に書き込む操作は、上記の関数に引数として渡したパスによって指定されます。