Skip to content

Commit

Permalink
Problem: We are not sure what is causing fractalide-tests to be slower
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
clacke committed Aug 15, 2018
1 parent faeaf08 commit 3e6f006
Showing 1 changed file with 22 additions and 3 deletions.
25 changes: 22 additions & 3 deletions pkgs/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -59,11 +59,30 @@ pkgs {
racketBuildInputs = builtins.filter (input: input.name != "compiler-lib") oldAttrs.racketBuildInputs;
});

fractalide-tests = self.runCommand "fractalide-tests" {
buildInputs = [ fractalide-tests-pkg.env ];
fractalide-tests = let
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 self.time ];
inherit racoTest;
} ''
racket -l- raco test ${fractalide-tests-pkg.env}/share/racket/pkgs/*/modules/rkt/rkt-fbp/agents
# If we do raco test <directory> the discovery process will try to mkdir $HOME.
# If we allow raco test to run on anything in agents/gui it will fail because
# requiring gui fails on headless.
find ${fractalide-tests-pkg.env}/share/racket/pkgs/*/modules/rkt/rkt-fbp/agents \
'(' -name gui -prune ')' -o '(' -name '*.rkt' -print ')' |
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 ];
});
})
];
}

0 comments on commit 3e6f006

Please sign in to comment.