Skip to content

Commit 0dbf91e

Browse files
committed
Show same metric scales
1 parent 416c3f8 commit 0dbf91e

File tree

2 files changed

+71
-25
lines changed

2 files changed

+71
-25
lines changed

README.md

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,35 +23,35 @@ For specific benchmarks:
2323

2424
|Name|10|100|1000|10000|
2525
|---|---|---|---|---|
26-
|Data.List|92.68 ns|837.2 ns|9.012 μs|158.7 μs|
26+
|Data.List|92.68 ns|0.837 μs|9.012 μs|0.159 ms|
2727
|Data.Vector|389.9 ns|8.656 μs|515.0 μs|74.00 ms|
2828
|Data.Vector.Unboxed|323.5 ns|4.012 μs|227.3 μs|24.56 ms|
29-
|Data.Sequence|217.4 ns|2.802 μs|34.63 μs|884.2 μs|
29+
|Data.Sequence|217.4 ns|2.802 μs|34.63 μs|0.884 ms|
3030

3131
## Replicate
3232

3333
|Name|10|100|1000|10000|
3434
|---|---|---|---|---|
35-
|Data.List|119.1 ns|1.003 μs|9.834 μs|98.61 μs|
36-
|Data.Vector|985.3 ns|1.536 μs|4.117 μs|29.28 μs|
37-
|Data.Vector.Unboxed|44.31 ns|107.5 ns|781.1 ns|6.956 μs|
35+
|Data.List|119.1 ns|1003 ns|9.834 μs|98.61 μs|
36+
|Data.Vector|985.3 ns|1536 ns|4.117 μs|29.28 μs|
37+
|Data.Vector.Unboxed|44.31 ns|107.5 ns|0.781 μs|6.956 μs|
3838
|Data.Sequence|79.31 ns|945.9 ns|9.394 μs|94.60 μs|
3939

4040
## Indexing
4141

4242
|Name|10|100|1000|10000|
4343
|---|---|---|---|---|
44-
|Data.List|38.47 ns|199.8 ns|1.923 μs|19.92 μs|
45-
|Data.Vector|36.92 ns|37.01 ns|37.09 ns|36.73 ns|
46-
|Data.Vector.Unboxed|19.84 ns|20.37 ns|20.14 ns|20.13 ns|
47-
|Data.Sequence|41.17 ns|87.40 ns|144.4 ns|48.15 ns|
44+
|Data.List|38.47 ns|199.8 ns|1923 ns|19.92 μs|
45+
|Data.Vector|36.92 ns|37.01 ns|37.09 ns|0.037 μs|
46+
|Data.Vector.Unboxed|19.84 ns|20.37 ns|20.14 ns|0.020 μs|
47+
|Data.Sequence|41.17 ns|87.40 ns|144.4 ns|0.048 μs|
4848

4949
## Length
5050

5151
|Name|10000|
5252
|---|---|
5353
|Data.List|17.27 μs|
54-
|Data.Vector|18.55 ns|
55-
|Data.Vector.Unboxed|11.06 ns|
56-
|Data.Sequence|10.78 ns|
54+
|Data.Vector|0.019 μs|
55+
|Data.Vector.Unboxed|0.011 μs|
56+
|Data.Sequence|0.011 μs|
5757

Report.hs

Lines changed: 59 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
1+
{-# LANGUAGE ScopedTypeVariables #-}
12
{-# OPTIONS_GHC -fno-warn-name-shadowing #-}
23
{-# LANGUAGE ExistentialQuantification #-}
34
{-# LANGUAGE BangPatterns #-}
45

56
module Main (main) where
67

7-
import Control.DeepSeq
8-
import Criterion.Measurement
9-
import Data.Function
10-
import Data.List
11-
import System.Environment
12-
import Text.CSV
8+
import Control.DeepSeq
9+
import Data.Function
10+
import Data.List
11+
import System.Environment
12+
import Text.CSV
13+
import Text.Printf
1314

1415
main :: IO ()
1516
main = do
@@ -20,7 +21,6 @@ reportFromCsv :: FilePath -> IO ()
2021
reportFromCsv fp = do
2122
result <- parseCSVFromFile fp
2223
case result of
23-
Left e -> print e
2424
Right (_:rows) -> do
2525
!readme <- fmap force (readFile "README.md")
2626
let sep = "<!-- RESULTS -->"
@@ -34,17 +34,30 @@ reportFromCsv fp = do
3434
(filter
3535
(not . null . filter (not . null . filter (not . null)))
3636
(groupBy (on (==) (takeWhile (/= '/') . concat . take 1)) rows))))
37+
_ -> error "Couldn't parse csv"
3738

3839
format :: [[String]] -> String
3940
format rows =
4041
("## " ++ takeWhile (/= '/') (concat (concat (take 1 (drop 1 rows))))) ++
4142
"\n\n" ++
42-
unlines [("|Name|" ++ intercalate "|" scales ++ "|"), "|" ++ concat (replicate (1 + length scales) "---|")] ++
4343
unlines
44-
(map (\name -> "|" ++ name ++ "|" ++ intercalate "|" (values name) ++ "|") (names))
44+
[ ("|Name|" ++ intercalate "|" scales ++ "|")
45+
, "|" ++ concat (replicate (1 + length scales) "---|")
46+
] ++
47+
unlines
48+
(map
49+
(\name ->
50+
"|" ++ name ++ "|" ++ intercalate "|" (valuesByName name) ++ "|")
51+
(names))
4552
where
46-
values name =
47-
map (\(_:mean:_) -> float mean) (filter ((== name) . rowName) rows)
53+
valuesByName name =
54+
map
55+
(\row@(_:mean:_) ->
56+
let scale = rowScale row
57+
in float (valuesByScale scale) (read mean))
58+
(filter ((== name) . rowName) rows)
59+
valuesByScale scale =
60+
map (\(_:mean:_) -> read mean) (filter ((== scale) . rowScale) rows)
4861
names = nub (map rowName rows)
4962
scales = nub (map rowScale rows)
5063
rowName row =
@@ -57,6 +70,39 @@ format rows =
5770
let scale = dropWhile (== ':') (dropWhile (/= ':') (concat (take 1 row)))
5871
in scale
5972

73+
float :: [Double] -> Double -> String
74+
float others x = let (scale, ext) = secs (mean others)
75+
in with (x * scale) ext
76+
77+
-- | Convert a number of seconds to a string. The string will consist
78+
-- of four decimal places, followed by a short description of the time
79+
-- units.
80+
secs :: Double -> (Double, String)
81+
secs k
82+
| k >= 1 = 1 `pair` "s"
83+
| k >= 1e-3 = 1e3 `pair` "ms"
84+
| k >= 1e-6 = 1e6 `pair` "μs"
85+
| k >= 1e-9 = 1e9 `pair` "ns"
86+
| k >= 1e-12 = 1e12 `pair` "ps"
87+
| k >= 1e-15 = 1e15 `pair` "fs"
88+
| k >= 1e-18 = 1e18 `pair` "as"
89+
| otherwise = error "Bad scale"
90+
where pair= (,)
91+
92+
with :: Double -> String -> String
93+
with (t :: Double) (u :: String)
94+
| t >= 1e9 = printf "%.4g %s" t u
95+
| t >= 1e3 = printf "%.0f %s" t u
96+
| t >= 1e2 = printf "%.1f %s" t u
97+
| t >= 1e1 = printf "%.2f %s" t u
98+
| otherwise = printf "%.3f %s" t u
6099

61-
float :: String -> String
62-
float x = secs (read x)
100+
-- | Simple rolling average.
101+
mean :: [Double] -> Double
102+
mean =
103+
snd .
104+
foldr
105+
(\x (cnt,avg) ->
106+
( cnt + 1
107+
, (x + avg * cnt) / (cnt + 1)))
108+
(0, 0)

0 commit comments

Comments
 (0)