From 8f4251d098c7346cab0bea7d6ecf5ef9ba372ee4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claes=20Wallin=20=28=E9=9F=8B=E5=98=89=E8=AA=A0=29?= Date: Tue, 14 Aug 2018 19:03:17 +0800 Subject: [PATCH] Problem: We are not sure what is causing fractalide-tests to be slower Building fractalide-tests is 2-3x slower than non-nix raco test with just full racket and raco-linked fractalide. Is it because if the huge links.rktd? If so, flattening should help. Solution: Add a flattened version of fractalide-tests to find out. Add 'time -p' to the fractalide-tests* commands. Result: pkgs$ nix-build -A fractalide-tests 2>/dev/null | xargs nix-store --read-log | tail -n 3 real 99.86 user 216.53 sys 155.04 $ nix-build -A fractalide-tests-flat 2>/dev/null | xargs nix-store --read-log | tail -n 3 real 16.67 user 48.75 sys 10.58 Each time a tested file requires a dependency, racket has to chase through 200 directories for it. This is made worse by the fact that we start racket once for each file we find. Possible solutions: - Without modifying 'raco test' itself, we could perhaps make our own wrapper around the test runner to keep everything in one racket process. - The real improvement would probably be to solve fractalide/racket2nix#158 : Build separate derivations for all packages, then build a racket environment that links them all in one folder. Non-solution: - Flattening fractalide is probably not an option. It takes so much longer to build, and the derivations for the dependencies cannot be reused. It would negate any speed advantage for the tests. --- pkgs/default.nix | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/pkgs/default.nix b/pkgs/default.nix index 77bcfde6..9f97c464 100644 --- a/pkgs/default.nix +++ b/pkgs/default.nix @@ -59,15 +59,15 @@ pkgs { }); fractalide-tests = let - # parallel cannot quite handle full inline bash, and destroys quoting, so we can't use bash -c + # parallel cannot quite handle full inline bash, and destroys quoting, so we can't use bash -c racoTest = builtins.toFile "raco-test.sh" '' racket -l- raco test "$@" |& grep -v -e "warning: tool .* registered twice" -e "@[(]test-responsible" exit ''${PIPESTATUS[0]} ''; in self.runCommand "fractalide-tests" { - buildInputs = [ fractalide-tests-pkg.env self.parallel ]; + buildInputs = [ fractalide-tests-pkg.env self.parallel self.time ]; inherit racoTest; } '' # If we do raco test the discovery process will try to mkdir $HOME. @@ -76,10 +76,14 @@ pkgs { find ${fractalide-tests-pkg.env}/share/racket/pkgs/*/modules/rkt/rkt-fbp/agents \ '(' -name gui -prune ')' -o '(' -name '*.rkt' -print ')' | - parallel -n 1 -j ''${NIX_BUILD_CORES:-1} bash $racoTest | + time -p parallel -n 1 -j ''${NIX_BUILD_CORES:-1} bash $racoTest | tee $out exit ''${PIPESTATUS[1]} ''; + + fractalide-tests-flat = fractalide-tests.overrideAttrs (oldAttrs: { + buildInputs = [ (fractalide.override { flat = true; }).env self.parallel self.time ]; + }); }) ]; }