Skip to content

Conversation

@laurenthuberdeau
Copy link
Contributor

@laurenthuberdeau laurenthuberdeau commented Feb 24, 2022

Results:

Small improvement. Considering that the change is small and doesn't impact the ease of development, I suggest we merge it. We'll just have to be careful to not silently pack/unpack the data by using the pattern synonyms in Semantics.

Before:

benchmarking clique/5
time                 92.27 μs   (91.50 μs .. 93.54 μs)
                     0.999 R²   (0.998 R² .. 1.000 R²)
mean                 93.09 μs   (92.42 μs .. 93.81 μs)
std dev              2.302 μs   (1.893 μs .. 2.923 μs)
variance introduced by outliers: 21% (moderately inflated)

benchmarking clique/10
time                 333.2 μs   (332.1 μs .. 334.6 μs)
                     1.000 R²   (1.000 R² .. 1.000 R²)
mean                 333.3 μs   (332.5 μs .. 334.5 μs)
std dev              2.966 μs   (2.033 μs .. 4.108 μs)

benchmarking clique/25
time                 2.258 ms   (2.250 ms .. 2.269 ms)
                     1.000 R²   (0.999 R² .. 1.000 R²)
mean                 2.268 ms   (2.260 ms .. 2.282 ms)
std dev              32.68 μs   (23.77 μs .. 50.49 μs)

benchmarking clique/40
time                 5.671 ms   (5.649 ms .. 5.696 ms)
                     1.000 R²   (1.000 R² .. 1.000 R²)
mean                 5.657 ms   (5.641 ms .. 5.668 ms)
std dev              41.02 μs   (33.25 μs .. 52.26 μs)

benchmarking line/5
time                 89.98 μs   (89.39 μs .. 90.80 μs)
                     0.999 R²   (0.999 R² .. 1.000 R²)
mean                 89.22 μs   (88.71 μs .. 89.87 μs)
std dev              1.948 μs   (1.427 μs .. 2.500 μs)
variance introduced by outliers: 18% (moderately inflated)

benchmarking line/10
time                 371.5 μs   (370.4 μs .. 372.9 μs)
                     1.000 R²   (1.000 R² .. 1.000 R²)
mean                 371.6 μs   (370.9 μs .. 372.5 μs)
std dev              2.809 μs   (2.343 μs .. 3.419 μs)

benchmarking line/25
time                 3.178 ms   (3.156 ms .. 3.220 ms)
                     0.999 R²   (0.998 R² .. 1.000 R²)
mean                 3.182 ms   (3.165 ms .. 3.207 ms)
std dev              68.43 μs   (51.06 μs .. 89.99 μs)

benchmarking line/40
time                 10.65 ms   (10.57 ms .. 10.78 ms)
                     0.999 R²   (0.998 R² .. 1.000 R²)
mean                 10.69 ms   (10.64 ms .. 10.76 ms)
std dev              158.2 μs   (117.6 μs .. 202.3 μs)

benchmarking loop/50
time                 494.2 μs   (490.0 μs .. 499.0 μs)
                     0.999 R²   (0.998 R² .. 0.999 R²)
mean                 492.9 μs   (488.3 μs .. 499.6 μs)
std dev              18.57 μs   (14.20 μs .. 24.43 μs)
variance introduced by outliers: 30% (moderately inflated)

benchmarking loop/100
time                 1.401 ms   (1.393 ms .. 1.413 ms)
                     0.999 R²   (0.999 R² .. 1.000 R²)
mean                 1.411 ms   (1.406 ms .. 1.419 ms)
std dev              21.32 μs   (15.94 μs .. 33.33 μs)

benchmarking loop/500
time                 21.63 ms   (21.38 ms .. 21.91 ms)
                     0.999 R²   (0.998 R² .. 1.000 R²)
mean                 21.21 ms   (21.10 ms .. 21.38 ms)
std dev              321.7 μs   (214.5 μs .. 500.1 μs)

benchmarking loop/1000
time                 83.70 ms   (83.27 ms .. 84.30 ms)
                     1.000 R²   (1.000 R² .. 1.000 R²)
mean                 83.69 ms   (83.42 ms .. 84.04 ms)
std dev              491.0 μs   (300.5 μs .. 784.5 μs)

benchmarking tight/50
time                 202.9 μs   (200.8 μs .. 205.2 μs)
                     0.999 R²   (0.999 R² .. 0.999 R²)
mean                 207.1 μs   (204.8 μs .. 210.4 μs)
std dev              9.345 μs   (6.641 μs .. 14.57 μs)
variance introduced by outliers: 44% (moderately inflated)

benchmarking tight/100
time                 719.7 μs   (718.6 μs .. 720.9 μs)
                     1.000 R²   (1.000 R² .. 1.000 R²)
mean                 723.3 μs   (721.7 μs .. 725.7 μs)
std dev              6.186 μs   (4.581 μs .. 8.501 μs)

benchmarking tight/500
time                 16.53 ms   (16.49 ms .. 16.57 ms)
                     1.000 R²   (1.000 R² .. 1.000 R²)
mean                 16.53 ms   (16.51 ms .. 16.55 ms)
std dev              54.79 μs   (40.68 μs .. 81.67 μs)

benchmarking tight/1000
time                 71.07 ms   (70.91 ms .. 71.27 ms)
                     1.000 R²   (1.000 R² .. 1.000 R²)
mean                 71.07 ms   (70.98 ms .. 71.15 ms)
std dev              159.1 μs   (116.5 μs .. 234.5 μs)

benchmarking parse/50
time                 6.128 ms   (6.102 ms .. 6.153 ms)
                     1.000 R²   (1.000 R² .. 1.000 R²)
mean                 6.122 ms   (6.105 ms .. 6.137 ms)
std dev              46.25 μs   (35.18 μs .. 67.21 μs)

benchmarking parse/100
time                 12.29 ms   (12.19 ms .. 12.47 ms)
                     0.998 R²   (0.995 R² .. 1.000 R²)
mean                 12.20 ms   (12.15 ms .. 12.38 ms)
std dev              237.8 μs   (81.32 μs .. 459.2 μs)

benchmarking parse/500
time                 68.82 ms   (67.25 ms .. 70.19 ms)
                     0.999 R²   (0.999 R² .. 1.000 R²)
mean                 67.61 ms   (67.15 ms .. 68.14 ms)
std dev              903.0 μs   (593.0 μs .. 1.430 ms)

benchmarking parse/1000
time                 136.0 ms   (135.5 ms .. 136.3 ms)
                     1.000 R²   (1.000 R² .. 1.000 R²)
mean                 135.8 ms   (135.1 ms .. 136.1 ms)
std dev              693.6 μs   (261.1 μs .. 1.136 ms)
variance introduced by outliers: 11% (moderately inflated)

Now:

benchmarking clique/5  
time                 86.66 μs   (86.54 μs .. 86.79 μs)
                     1.000 R²   (1.000 R² .. 1.000 R²)
mean                 86.97 μs   (86.84 μs .. 87.15 μs)
std dev              502.2 ns   (395.5 ns .. 642.6 ns)
                       
benchmarking clique/10 
time                 318.3 μs   (317.7 μs .. 318.8 μs)
                     1.000 R²   (1.000 R² .. 1.000 R²)
mean                 318.3 μs   (317.9 μs .. 318.7 μs)
std dev              1.275 μs   (1.091 μs .. 1.568 μs)
                       
benchmarking clique/25 
time                 2.183 ms   (2.155 ms .. 2.215 ms)
                     0.998 R²   (0.996 R² .. 1.000 R²)
mean                 2.174 ms   (2.158 ms .. 2.215 ms)
std dev              85.12 μs   (29.05 μs .. 156.3 μs)
variance introduced by outliers: 24% (moderately inflated)
                       
benchmarking clique/40 
time                 5.467 ms   (5.407 ms .. 5.535 ms)
                     0.999 R²   (0.999 R² .. 1.000 R²)
mean                 5.399 ms   (5.377 ms .. 5.428 ms)
std dev              80.40 μs   (60.65 μs .. 101.5 μs)
                       
benchmarking line/5    
time                 85.57 μs   (85.47 μs .. 85.68 μs)
                     1.000 R²   (1.000 R² .. 1.000 R²)
mean                 85.62 μs   (85.54 μs .. 85.72 μs)
std dev              305.2 ns   (247.2 ns .. 377.1 ns)
                       
benchmarking line/10   
time                 354.1 μs   (353.7 μs .. 354.6 μs)
                     1.000 R²   (1.000 R² .. 1.000 R²)
mean                 354.1 μs   (353.7 μs .. 354.5 μs)
std dev              1.286 μs   (1.060 μs .. 1.688 μs)
                       
benchmarking line/25   
time                 2.987 ms   (2.974 ms .. 3.005 ms)
                     1.000 R²   (0.999 R² .. 1.000 R²)
mean                 2.976 ms   (2.972 ms .. 2.986 ms)
std dev              22.72 μs   (14.04 μs .. 41.08 μs)
                       
benchmarking line/40   
time                 10.14 ms   (9.999 ms .. 10.23 ms)
                     0.999 R²   (0.999 R² .. 1.000 R²)
mean                 9.950 ms   (9.917 ms .. 10.01 ms)
std dev              118.9 μs   (83.44 μs .. 150.1 μs)
                       
benchmarking loop/50   
time                 470.3 μs   (462.8 μs .. 476.5 μs)
                     0.999 R²   (0.997 R² .. 1.000 R²)
mean                 460.4 μs   (458.1 μs .. 464.3 μs)
std dev              10.18 μs   (6.753 μs .. 17.01 μs)
variance introduced by outliers: 13% (moderately inflated)
                       
benchmarking loop/100  
time                 1.334 ms   (1.327 ms .. 1.340 ms)
                     1.000 R²   (1.000 R² .. 1.000 R²)
mean                 1.339 ms   (1.337 ms .. 1.342 ms)
std dev              9.650 μs   (7.881 μs .. 12.18 μs)
                       
benchmarking loop/500  
time                 20.16 ms   (20.02 ms .. 20.33 ms)
                     1.000 R²   (1.000 R² .. 1.000 R²)
mean                 20.10 ms   (20.03 ms .. 20.18 ms)
std dev              172.6 μs   (126.2 μs .. 238.3 μs)
                       
benchmarking loop/1000 
time                 79.66 ms   (78.37 ms .. 83.24 ms)
                     0.997 R²   (0.990 R² .. 1.000 R²)
mean                 79.51 ms   (78.79 ms .. 81.74 ms)
std dev              1.859 ms   (487.7 μs .. 3.167 ms)
                       
benchmarking tight/50  
time                 186.1 μs   (185.7 μs .. 186.8 μs)
                     1.000 R²   (1.000 R² .. 1.000 R²)
mean                 187.0 μs   (186.4 μs .. 188.0 μs)
std dev              2.400 μs   (1.341 μs .. 4.237 μs)
                       
benchmarking tight/100 
time                 675.2 μs   (673.7 μs .. 676.7 μs)
                     1.000 R²   (1.000 R² .. 1.000 R²)
mean                 677.1 μs   (675.8 μs .. 678.7 μs)
std dev              5.148 μs   (4.071 μs .. 7.105 μs)
                       
benchmarking tight/500 
time                 15.51 ms   (15.37 ms .. 15.63 ms)
                     1.000 R²   (0.999 R² .. 1.000 R²)
mean                 15.73 ms   (15.60 ms .. 16.13 ms)
std dev              508.2 μs   (152.4 μs .. 992.6 μs)
variance introduced by outliers: 12% (moderately inflated)
                       
benchmarking tight/1000
time                 67.31 ms   (66.96 ms .. 67.74 ms)
                     1.000 R²   (1.000 R² .. 1.000 R²)
mean                 67.53 ms   (67.23 ms .. 68.53 ms)
std dev              839.8 μs   (277.8 μs .. 1.430 ms)
                       
benchmarking parse/50  
time                 6.063 ms   (6.038 ms .. 6.086 ms)
                     1.000 R²   (1.000 R² .. 1.000 R²)
mean                 6.055 ms   (6.036 ms .. 6.089 ms)
std dev              72.71 μs   (51.55 μs .. 114.3 μs)
                       
benchmarking parse/100 
time                 12.05 ms   (11.97 ms .. 12.11 ms)
                     1.000 R²   (1.000 R² .. 1.000 R²)
mean                 12.01 ms   (11.97 ms .. 12.04 ms)
std dev              91.99 μs   (77.59 μs .. 118.5 μs)
                       
benchmarking parse/500 
time                 66.37 ms   (66.01 ms .. 66.71 ms)
                     1.000 R²   (1.000 R² .. 1.000 R²)
mean                 66.79 ms   (66.57 ms .. 67.39 ms)
std dev              609.9 μs   (265.2 μs .. 1.038 ms)
                       
benchmarking parse/1000
time                 137.4 ms   (134.2 ms .. 140.6 ms)
                     0.999 R²   (0.998 R² .. 1.000 R²)
mean                 135.1 ms   (134.0 ms .. 136.5 ms)
std dev              1.907 ms   (1.253 ms .. 3.004 ms)
variance introduced by outliers: 11% (moderately inflated)


-- COMPLETE Pragma is necessary because the exhausiveness checker doesn't work at all with pattern synonyms.
-- See https://gitlab.haskell.org/ghc/ghc/-/wikis/pattern-synonyms/complete-sigs
{-# COMPLETE I, B, T #-}
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same trick that I used when I changed the representation of IP addresses in portal-suite:
https://github.com/Simspace/portal-suite/blob/dev/common-utilities/haskell/src/SimSpace/Utils/Cidr.hs#L36-L43

Copy link
Contributor Author

@laurenthuberdeau laurenthuberdeau Feb 24, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, this pattern is complete in a strange way because the cases are not disjoint. For example, the following code always returns "true" because T matches everything.

case I 5 of
  T _ -> "text"
  I _  -> "int"
  B _ -> "bool"

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant