blob: 594459da038b299b8b2abfd9b3d2f905321ecbae (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
-- For in depth details see the ticket #21839. The short version:
-- We noticed that GHC got slower compiling Cabal the libary.
-- Eventually I narrowed it down to the pattern below of deriving Generics
-- for a Enum, and then deriving a Binary instance for that Enum via Generics.
-- A pattern very frequently used in Cabal.
-- However this turned out to be a classic compile vs runtime tradeoff.
-- In benchmarks I found the resulting code for the Binary instance was running
-- more than twice as fast!
-- So we decided to merely document this change and add a test representing this behaviour
-- rather than trying to coax ghc back into its old behaviour.
{-# LANGUAGE DeriveGeneric #-}
{-# OPTIONS_GHC #-}
module Main
( main
) where
import GHC.Generics
import Data.Typeable
import Data.Binary
import qualified Data.ByteString.Lazy as BL
import qualified Data.ByteString as BS
data PathTemplateVariable =
Var0
| Var1
| Var2
| Var3
| Var4
| Var5
| Var6
| Var7
| Var8
| Var9
deriving (Generic,Enum)
instance Binary PathTemplateVariable
main :: IO ()
main = do
let lists = replicate 10000 Var0
lbs = encode lists
print $ BS.length $ BS.toStrict lbs
|