cabal2nix
cabal2nix copied to clipboard
2.6 regressed in performance
2.6 takes ~2s for generating a package, while 2.5 took ~1s.
$ \time /nix/store/km80h0kh6m6qmjwhdq73i31vpnrc61cg-cabal2nix-2.5/bin/cabal2nix cabal://mtl
{ mkDerivation, base, stdenv, transformers }:
mkDerivation {
pname = "mtl";
version = "2.2.1";
sha256 = "1icdbj2rshzn0m1zz5wa7v3xvkf6qw811p4s7jgqwvx1ydwrvrfa";
revision = "1";
editedCabalFile = "0fsa965g9h23mlfjzghmmhcb9dmaq8zpm374gby6iwgdx47q0njb";
libraryHaskellDepends = [ base transformers ];
homepage = "http://github.com/ekmett/mtl";
description = "Monad classes, using functional dependencies";
license = stdenv.lib.licenses.bsd3;
}
0.97user 0.21system 0:01.19elapsed 99%CPU (0avgtext+0avgdata 537108maxresident)k
0inputs+8outputs (0major+133288minor)pagefaults 0swaps
$ \time /nix/store/0g3x5r9paygsvfd9y8m1rsrri2amh990-cabal2nix-2.6/bin/cabal2nix cabal://mtl
{ mkDerivation, base, stdenv, transformers }:
mkDerivation {
pname = "mtl";
version = "2.2.1";
sha256 = "cae59d79f3a16f8e9f3c9adc1010c7c6cdddc73e8a97ff4305f6439d855c8dc5";
revision = "1";
editedCabalFile = "0fsa965g9h23mlfjzghmmhcb9dmaq8zpm374gby6iwgdx47q0njb";
libraryHaskellDepends = [ base transformers ];
homepage = "http://github.com/ekmett/mtl";
description = "Monad classes, using functional dependencies";
license = stdenv.lib.licenses.bsd3;
}
1.89user 0.30system 0:02.20elapsed 100%CPU (0avgtext+0avgdata 593852maxresident)k
0inputs+0outputs (0major+147407minor)pagefaults 0swaps
cc @jmitchell
Bisecting leads to eef3b98ebd69d2f80b334e0d196a6cd2c9867b58
I've profiled a cabal2nix cabal://mtl call that takes 2s:
COST CENTRE MODULE SRC %time %alloc
parseTarball Distribution.Hackage.DB.Unparsed src/Distribution/Hackage/DB/Unparsed.hs:(45,1)-(47,83) 44.4 41.1
fromTarPath Codec.Archive.Tar.Types Codec/Archive/Tar/Types.hs:(300,1)-(308,36) 27.0 35.9
readTarball Distribution.Hackage.DB.Unparsed src/Distribution/Hackage/DB/Unparsed.hs:42:1-80 12.9 9.1
munch Distribution.Compat.ReadP Distribution/Compat/ReadP.hs:(272,1)-(277,34) 5.3 5.7
parsePackageName Distribution.ParseUtils Distribution/ParseUtils.hs:(629,1)-(635,49) 2.2 3.1
encodeStringUtf8 Distribution.Utils.String Distribution/Utils/String.hs:(66,1)-(85,44) 1.7 2.5
readP_to_S Distribution.Compat.ReadP Distribution/Compat/ReadP.hs:409:1-33 1.7 0.6
toShortText Distribution.Utils.ShortText Distribution/Utils/ShortText.hs:78:1-51 1.6 0.2
cc @nc6 and @4e6 that might be interested.
The gist is, cabal-install doesn't expose API for parsing hackage db and doesn't intend to in the future.
A minimal test case reproducing 2s (with hardcoded index path from cabal update):
$ cat slow.hs
import Data.Map
import Distribution.Types.PackageName
import Distribution.Hackage.DB.Unparsed
main :: IO ()
main = do
tar <- readTarball Nothing "/home/ielectric/.cabal/packages/hackage.haskell.org/01-index.tar"
putStrLn $ show $ Data.Map.lookup (mkPackageName "mtl") tar
Runing with cabal2nix 2.7:
$ nix-shell -p "haskellPackages.ghcWithPackages (ps: [ps.cabal2nix])" --run "\time runhaskell slow.hs"
...
2.76user 0.47system 0:03.24elapsed 99%CPU (0avgtext+0avgdata 934980maxresident)k
0inputs+0outputs (0major+218052minor)pagefaults 0swaps
So 2.7s, where ~0.5 is runhaskell.