diff options
-rw-r--r-- | testsuite/tests/perf/compiler/T21839c.hs | 46 | ||||
-rw-r--r-- | testsuite/tests/perf/compiler/T21839c.stdout | 1 | ||||
-rw-r--r-- | testsuite/tests/perf/compiler/all.T | 7 | ||||
-rw-r--r-- | testsuite/tests/perf/should_run/T21839r.hs | 46 | ||||
-rw-r--r-- | testsuite/tests/perf/should_run/T21839r.stdout | 1 | ||||
-rw-r--r-- | testsuite/tests/perf/should_run/all.T | 8 |
6 files changed, 109 insertions, 0 deletions
diff --git a/testsuite/tests/perf/compiler/T21839c.hs b/testsuite/tests/perf/compiler/T21839c.hs new file mode 100644 index 0000000000..594459da03 --- /dev/null +++ b/testsuite/tests/perf/compiler/T21839c.hs @@ -0,0 +1,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 diff --git a/testsuite/tests/perf/compiler/T21839c.stdout b/testsuite/tests/perf/compiler/T21839c.stdout new file mode 100644 index 0000000000..b95ab72342 --- /dev/null +++ b/testsuite/tests/perf/compiler/T21839c.stdout @@ -0,0 +1 @@ +10008 diff --git a/testsuite/tests/perf/compiler/all.T b/testsuite/tests/perf/compiler/all.T index cac2ebd48f..a70b93df01 100644 --- a/testsuite/tests/perf/compiler/all.T +++ b/testsuite/tests/perf/compiler/all.T @@ -643,3 +643,10 @@ test ('T20261', [collect_compiler_stats('all')], compile, ['']) + +# Track perf of generics based binary instances +test('T21839c', + [ collect_compiler_stats('all', 1), + only_ways(['normal'])], + compile, + ['-O'])
\ No newline at end of file diff --git a/testsuite/tests/perf/should_run/T21839r.hs b/testsuite/tests/perf/should_run/T21839r.hs new file mode 100644 index 0000000000..594459da03 --- /dev/null +++ b/testsuite/tests/perf/should_run/T21839r.hs @@ -0,0 +1,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 diff --git a/testsuite/tests/perf/should_run/T21839r.stdout b/testsuite/tests/perf/should_run/T21839r.stdout new file mode 100644 index 0000000000..b95ab72342 --- /dev/null +++ b/testsuite/tests/perf/should_run/T21839r.stdout @@ -0,0 +1 @@ +10008 diff --git a/testsuite/tests/perf/should_run/all.T b/testsuite/tests/perf/should_run/all.T index eb5124a155..9059a6f92f 100644 --- a/testsuite/tests/perf/should_run/all.T +++ b/testsuite/tests/perf/should_run/all.T @@ -395,3 +395,11 @@ test('T19347', compile_and_run, ['-O']) +# Track perf of generics based binary instances +test('T21839r', + [ collect_stats('bytes allocated', 10), + collect_runtime_residency(10), + collect_compiler_stats('bytes allocated', 1), + only_ways(['normal'])], + compile_and_run, + ['-O']) |