Skip to content

Duplicate project imports slow down the build #10512

@philderbeast

Description

@philderbeast

When a project has duplicate imports the build is slower than it could be1.

To see this in action, I've created a woops project, the same as the yops one (the Y-forking one from #10508) but every .project or .config also imports https://www.stackage.org/lts-21.25/cabal.config. The former takes 12 s to cabal build --dry-run and the later takes 200 ms. If I add one import from stackage to the root of the yops project, its build takes 425 ms.

$ ghc --numeric-version
9.4.8

$ time cabal run cabal-install:exe:cabal -- build --dry-run \
  --project-file=cabal-testsuite/PackageTests/ConditionalAndImport/woops-0.project
Resolving dependencies...
Warning: this is a debug build of cabal-install with assertions enabled.
When using configuration from:
  - https://www.stackage.org/lts-21.25/cabal.config
  - https://www.stackage.org/lts-21.25/cabal.config
  - https://www.stackage.org/lts-21.25/cabal.config
  - https://www.stackage.org/lts-21.25/cabal.config
  - https://www.stackage.org/lts-21.25/cabal.config
  - https://www.stackage.org/lts-21.25/cabal.config
  - https://www.stackage.org/lts-21.25/cabal.config
  - https://www.stackage.org/lts-21.25/cabal.config
  - https://www.stackage.org/lts-21.25/cabal.config
  - https://www.stackage.org/lts-21.25/cabal.config
  - https://www.stackage.org/lts-21.25/cabal.config
  - https://www.stackage.org/lts-21.25/cabal.config
  - https://www.stackage.org/lts-21.25/cabal.config
  - https://www.stackage.org/lts-21.25/cabal.config
  - https://www.stackage.org/lts-21.25/cabal.config
  - https://www.stackage.org/lts-21.25/cabal.config
  - https://www.stackage.org/lts-21.25/cabal.config
  - https://www.stackage.org/lts-21.25/cabal.config
  - https://www.stackage.org/lts-21.25/cabal.config
  - https://www.stackage.org/lts-21.25/cabal.config
  - https://www.stackage.org/lts-21.25/cabal.config
  - https://www.stackage.org/lts-21.25/cabal.config
  - https://www.stackage.org/lts-21.25/cabal.config
  - https://www.stackage.org/lts-21.25/cabal.config
  - https://www.stackage.org/lts-21.25/cabal.config
  - woops-0.project
  - woops-2.config
  - woops-4.config
  - woops-4.config
  - woops-6.config
  - woops-6.config
  - woops-6.config
  - woops-8.config
  - woops-8.config
  - woops-8.config
  - woops-8.config
  - woops/woops-1.config
  - woops/woops-3.config
  - woops/woops-3.config
  - woops/woops-5.config
  - woops/woops-5.config
  - woops/woops-5.config
  - woops/woops-7.config
  - woops/woops-7.config
  - woops/woops-7.config
  - woops/woops-7.config
  - woops/woops-9.config
  - woops/woops-9.config
  - woops/woops-9.config
  - woops/woops-9.config
  - woops/woops-9.config
The following errors occurred:
  - The package directory '.' does not contain any .cabal file.

________________________________________________________
Executed in   12.08 secs    fish           external
   usr time    2.94 secs    0.00 micros    2.94 secs
   sys time    0.45 secs  802.00 micros    0.45 secs
$ time cabal run cabal-install:exe:cabal -- build --dry-run \
  --project-file=cabal-testsuite/PackageTests/ConditionalAndImport/yops-0.project
Warning: this is a debug build of cabal-install with assertions enabled.
When using configuration from:
  - yops-0.project
  - yops-2.config
  - yops-4.config
  - yops-4.config
  - yops-6.config
  - yops-6.config
  - yops-6.config
  - yops-8.config
  - yops-8.config
  - yops-8.config
  - yops-8.config
  - yops/yops-1.config
  - yops/yops-3.config
  - yops/yops-3.config
  - yops/yops-5.config
  - yops/yops-5.config
  - yops/yops-5.config
  - yops/yops-7.config
  - yops/yops-7.config
  - yops/yops-7.config
  - yops/yops-7.config
  - yops/yops-9.config
  - yops/yops-9.config
  - yops/yops-9.config
  - yops/yops-9.config
  - yops/yops-9.config
The following errors occurred:
  - The package directory '.' does not contain any .cabal file.

________________________________________________________
Executed in  200.73 millis    fish           external
   usr time  148.65 millis    0.00 micros  148.65 millis
   sys time   52.03 millis  692.00 micros   51.33 millis

$ echo "import: https://www.stackage.org/lts-21.25/cabal.config" \
  >> cabal-testsuite/PackageTests/ConditionalAndImport/yops-0.project

$ time cabal run cabal-install:exe:cabal -- build --dry-run \
  --project-file=cabal-testsuite/PackageTests/ConditionalAndImport/yops-0.project
Warning: this is a debug build of cabal-install with assertions enabled.
When using configuration from:
  - https://www.stackage.org/lts-21.25/cabal.config
  - yops-0.project
  - yops-2.config
  - yops-4.config
  - yops-4.config
  - yops-6.config
  - yops-6.config
  - yops-6.config
  - yops-8.config
  - yops-8.config
  - yops-8.config
  - yops-8.config
  - yops/yops-1.config
  - yops/yops-3.config
  - yops/yops-3.config
  - yops/yops-5.config
  - yops/yops-5.config
  - yops/yops-5.config
  - yops/yops-7.config
  - yops/yops-7.config
  - yops/yops-7.config
  - yops/yops-7.config
  - yops/yops-9.config
  - yops/yops-9.config
  - yops/yops-9.config
  - yops/yops-9.config
  - yops/yops-9.config
The following errors occurred:
  - The package directory '.' does not contain any .cabal file.

________________________________________________________
Executed in  425.02 millis    fish           external
   usr time  210.23 millis    0.00 micros  210.23 millis
   sys time   49.17 millis  717.00 micros   48.45 millis

Footnotes

  1. Detect duplicate non-cyclical project imports #9933 tries to avoid this by making duplicate imports an error.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions