circuithub / rel8

Hey! Hey! Can u rel8?
https://rel8.readthedocs.io
Other
150 stars 38 forks source link

Rel8able records make app slow to start up #300

Open seanhess opened 7 months ago

seanhess commented 7 months ago

I am experiencing extremely slow startup times in my application. I'm working on a web interface and I need tight reload times to see design changes as I make them. I stripped down my app and narrowed the issue down to Rel8. If my app has a record that derives Rel8able it takes a long time to start, and it gets worse in proportion to the number of fields. In my app I'm experiencing 2-3 second delays.

I'm using ghc 9.4.7, Ventura 13.4.1, cabal 3.10.2.0.

Minimal example. Run in cabal repl. Notice the ~1s delay between when you hit enter to run main and when the output appears. You can see it happen over and over if you reload with :r and run main again.

module Main where

import GHC.Generics
import Rel8
import Prelude

main :: IO ()
main = do
  putStrLn "Hello World!"

data Dataset' f = Dataset
  { test1 :: Column f String
  , test2 :: Column f String
  , test3 :: Column f String
  , test4 :: Column f String
  , test5 :: Column f String
  , test6 :: Column f String
  , test7 :: Column f String
  , test8 :: Column f String
  , test9 :: Column f String
  , test0 :: Column f String
  , atest1 :: Column f String
  , atest2 :: Column f String
  , atest3 :: Column f String
  , atest4 :: Column f String
  , atest5 :: Column f String
  , atest6 :: Column f String
  , atest7 :: Column f String
  , atest8 :: Column f String
  , atest9 :: Column f String
  , atest0 :: Column f String
  , btest1 :: Column f String
  , btest2 :: Column f String
  , btest3 :: Column f String
  , btest4 :: Column f String
  , btest5 :: Column f String
  , btest6 :: Column f String
  , btest7 :: Column f String
  , btest8 :: Column f String
  , btest9 :: Column f String
  , btest0 :: Column f String
  , ctest1 :: Column f String
  , ctest2 :: Column f String
  , ctest3 :: Column f String
  , ctest4 :: Column f String
  , ctest5 :: Column f String
  , ctest6 :: Column f String
  , ctest7 :: Column f String
  , ctest8 :: Column f String
  , ctest9 :: Column f String
  , ctest0 :: Column f String
  }
  deriving (Generic, Rel8able)
seanhess commented 7 months ago

Wait, this gets stranger. I had forgotten to remove all my dependencies from my cabal file when stripping the project down to a reproducible example. This only happens if I also include morpheus-graphql. Here are dependencies that reproduce:

dependencies:
  - base >=4.16.4.0
  - aeson == 2.1.2.1
  - morpheus-graphql-client >= 0.27
  - morpheus-graphql-core
  - morpheus-graphql >= 0.27
  - rel8

Note that Morpheus is not referenced anywhere in the codebase, it's simply listed in the dependencies.

So it only happens when I derive Rel8able AND morpheus is in my dependencies. Any idea what's going on?