AutoBench

benchmark

インストール方法

stack
λ brew install gtk+3
λ export PKG_CONFIG_PATH="/usr/local/Cellar/libffi/3.2.1/lib/pkgconfig/"

λ git clone https://github.com/mathandley/AutoBench.git
λ cd AutoBench
λ stack install --extra-lib-dirs /usr/local/Cellar/libffi/3.2.1/lib/

λ AutoBench
Missing: FILEPATH

AutoBench (Version 0.1.0.0)

Usage: AutoBench FILEPATH

Available options:
  FILEPATH               User input file

ExitFailure 1
Testing cancelled. Press any key to exit...
Leaving AutoBench.

トラブルシューティング

integer-gmp-1.0.2.0 でエラーが発生する

λ stack run Input.hs

  ▸ Processing Input.hsAutoBench:
lookupSymbol failed in relocateSection (RELOC_GOT)
/Users/gupi/.stack/programs/x86_64-osx/ghc-8.4.4/lib/ghc-8.4.4/integer-gmp-1.0.2.0/HSinteger-gmp-1.0.2.0.o: unknown symbol `___gmp_rands'

unable to load package `integer-gmp-1.0.2.0'
Testing cancelled. Press any key to exit...

こんな感じでとりあえずOK

λ mv /Users/gupi/.stack/programs/x86_64-osx/ghc-8.4.4/lib/ghc-8.4.4/integer-gmp-1.0.2.0/HSinteger-gmp-1.0.2.0.o{,_DISABLE_GHC_ISSUE_15105}

使い方

まずは AutoBench に入力するファイルを作る

Input.hs
module Input (ts, slow, fast) where

import Data.Default         (def)
import AutoBench.Types      (DataOpts(..), TestSuite(..))

slow :: [Int] -> [Int]
slow = slowMapp id

fast :: [Int] -> [Int]
fast = fastMapp id

slowMapp :: (a -> a) -> [a] -> [a]
slowMapp f []      = []
slowMapp f (x:xs)  = x : slowMapp f (map f xs)

fastMapp :: (a -> a) -> [a] -> [a]
fastMapp f xs = sub id xs
  where
    sub _  []     = []
    sub fa (x:xs) = fa x : sub (f . fa) xs

genList :: Int -> [Int]
genList n = [1..n*10^3]

ts :: TestSuite
ts  = def { _dataOpts = Gen 0 500 10000 }

実行方法

AutoBench リポジトリでこんな感じで実行すると動く

λ stack run Input.hs

注意点

テストケースが少なすぎると実行できない

入力の型は NFData 型クラスのインスタンスになっている必要がある

Gen a b c[a, b .. c] というテストデータを作っている感じ

例として 0 から 10000 までの数値に対して 1000ずつ確認したい場合は Gen 0 1000 10000 となる

Last updated