cabal2nix icon indicating copy to clipboard operation
cabal2nix copied to clipboard

2.6 regressed in performance

Open domenkozar opened this issue 8 years ago • 5 comments

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

domenkozar avatar Nov 26 '17 23:11 domenkozar

cc @jmitchell

domenkozar avatar Nov 26 '17 23:11 domenkozar

Bisecting leads to eef3b98ebd69d2f80b334e0d196a6cd2c9867b58

domenkozar avatar Nov 27 '17 00:11 domenkozar

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

domenkozar avatar Nov 27 '17 11:11 domenkozar

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.

domenkozar avatar Nov 27 '17 12:11 domenkozar

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.

domenkozar avatar Nov 27 '17 12:11 domenkozar