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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions