forked from GitHub/gf-core
Use envvars in benchmark for controlling PGF/LPGF. Add readme.
This commit is contained in:
34
testsuite/lpgf/README.md
Normal file
34
testsuite/lpgf/README.md
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
# LPGF testsuite & benchmark
|
||||||
|
|
||||||
|
## Test
|
||||||
|
|
||||||
|
LPGF must be equivalent to PGF in terms of linearisation output.
|
||||||
|
|
||||||
|
Possible exceptions:
|
||||||
|
- No handling of variants (design choice)
|
||||||
|
- Rendering of missing fucntions
|
||||||
|
|
||||||
|
## Benchmark
|
||||||
|
|
||||||
|
### Compilation
|
||||||
|
|
||||||
|
Comparing PGF, LPGF along following criteria:
|
||||||
|
|
||||||
|
- Time
|
||||||
|
- Memory
|
||||||
|
- Binary file size
|
||||||
|
|
||||||
|
### Runtime (linearisation)
|
||||||
|
|
||||||
|
Comparing PGF, PGF2, LPGF along following criteria:
|
||||||
|
|
||||||
|
- Time
|
||||||
|
- Memory
|
||||||
|
|
||||||
|
### Running
|
||||||
|
|
||||||
|
```
|
||||||
|
stack build --test --bench --no-run-tests --no-run-benchmarks && time stack bench
|
||||||
|
stack build --test --bench --no-run-tests --no-run-benchmarks && time PGF_ONLY=1 stack bench
|
||||||
|
stack build --test --bench --no-run-tests --no-run-benchmarks && time LPGF_ONLY=1 stack bench
|
||||||
|
```
|
||||||
@@ -8,12 +8,14 @@ import PGF (PGF)
|
|||||||
import GF (compileToPGF, compileToLPGF, writePGF, writeLPGF)
|
import GF (compileToPGF, compileToLPGF, writePGF, writeLPGF)
|
||||||
import GF.Support (Options, Flags (..), Verbosity (..), noOptions, addOptions, modifyFlags)
|
import GF.Support (Options, Flags (..), Verbosity (..), noOptions, addOptions, modifyFlags)
|
||||||
|
|
||||||
|
import Control.Monad (when)
|
||||||
import qualified Data.List as L
|
import qualified Data.List as L
|
||||||
import Data.Maybe (fromJust)
|
import Data.Maybe (fromJust, isNothing)
|
||||||
import qualified Data.Map as Map
|
import qualified Data.Map as Map
|
||||||
import Data.Text (Text)
|
import Data.Text (Text)
|
||||||
import Data.Time.Clock (getCurrentTime, diffUTCTime)
|
import Data.Time.Clock (getCurrentTime, diffUTCTime)
|
||||||
import System.Directory (listDirectory, getFileSize)
|
import System.Directory (listDirectory, getFileSize)
|
||||||
|
import System.Environment (lookupEnv)
|
||||||
import System.FilePath ((</>), takeBaseName, takeExtension)
|
import System.FilePath ((</>), takeBaseName, takeExtension)
|
||||||
import Text.Printf (printf)
|
import Text.Printf (printf)
|
||||||
|
|
||||||
@@ -35,27 +37,29 @@ main = do
|
|||||||
mods <- map (dir </>)
|
mods <- map (dir </>)
|
||||||
. filter (\p -> grammarName `L.isPrefixOf` takeBaseName p && takeExtension p == ".gf")
|
. filter (\p -> grammarName `L.isPrefixOf` takeBaseName p && takeExtension p == ".gf")
|
||||||
<$> listDirectory dir
|
<$> listDirectory dir
|
||||||
|
printf "Found modules: %s\n" (unwords mods)
|
||||||
-- Compile
|
|
||||||
(pathPGF, pgf) <- time "compile PGF" (compilePGF mods)
|
|
||||||
(pathLPGF, lpgf) <- time "compile LPGF" (compileLPGF mods)
|
|
||||||
|
|
||||||
-- Compare filesizes
|
|
||||||
sizePGF <- getFileSize pathPGF
|
|
||||||
sizeLPGF <- getFileSize pathLPGF
|
|
||||||
printf "- PGF size: %s\n" (convertSize sizePGF)
|
|
||||||
printf "- LPGF size: %s\n" (convertSize sizeLPGF)
|
|
||||||
|
|
||||||
-- Read trees
|
-- Read trees
|
||||||
lns <- lines <$> readFile (dir </> treesFile)
|
lns <- lines <$> readFile (dir </> treesFile)
|
||||||
let trees = map (fromJust . PGF.readExpr) lns
|
let trees = map (fromJust . PGF.readExpr) lns
|
||||||
printf "Read %d trees\n" (length trees)
|
printf "Read %d trees\n" (length trees)
|
||||||
|
|
||||||
-- Linearise
|
doPGF <- isNothing <$> lookupEnv "LPGF_ONLY"
|
||||||
time "linearise PGF" (return $ length $ linPGF pgf trees)
|
doLPGF <- isNothing <$> lookupEnv "PGF_ONLY"
|
||||||
time "linearise LPGF" (return $ length $ linLPGF lpgf trees)
|
|
||||||
|
|
||||||
return ()
|
when doPGF $ do
|
||||||
|
(path, pgf) <- time "compile PGF" (compilePGF mods)
|
||||||
|
size <- getFileSize path
|
||||||
|
printf "- PGF size: %s\n" (convertSize size)
|
||||||
|
time "linearise PGF" (return $ length $ linPGF pgf trees)
|
||||||
|
return ()
|
||||||
|
|
||||||
|
when doLPGF $ do
|
||||||
|
(path, lpgf) <- time "compile LPGF" (compileLPGF mods)
|
||||||
|
size <- getFileSize path
|
||||||
|
printf "- LPGF size: %s\n" (convertSize size)
|
||||||
|
time "linearise LPGF" (return $ length $ linLPGF lpgf trees)
|
||||||
|
return ()
|
||||||
|
|
||||||
time :: String -> IO a -> IO a
|
time :: String -> IO a -> IO a
|
||||||
time desc io = do
|
time desc io = do
|
||||||
|
|||||||
Reference in New Issue
Block a user