mirror of
https://github.com/anoma/juvix.git
synced 2024-12-04 06:23:13 +03:00
3a4cbc742d
The following benchmark compares juvix 0.6.0 with polysemy and a new version (implemented in this pr) which replaces polysemy by effectful. # Typecheck standard library without caching ``` hyperfine --warmup 2 --prepare 'juvix-polysemy clean' 'juvix-polysemy typecheck Stdlib/Prelude.juvix' 'juvix-effectful typecheck Stdlib/Prelude.juvix' Benchmark 1: juvix-polysemy typecheck Stdlib/Prelude.juvix Time (mean ± σ): 3.924 s ± 0.143 s [User: 3.787 s, System: 0.084 s] Range (min … max): 3.649 s … 4.142 s 10 runs Benchmark 2: juvix-effectful typecheck Stdlib/Prelude.juvix Time (mean ± σ): 2.558 s ± 0.074 s [User: 2.430 s, System: 0.084 s] Range (min … max): 2.403 s … 2.646 s 10 runs Summary juvix-effectful typecheck Stdlib/Prelude.juvix ran 1.53 ± 0.07 times faster than juvix-polysemy typecheck Stdlib/Prelude.juvix ``` # Typecheck standard library with caching ``` hyperfine --warmup 1 'juvix-effectful typecheck Stdlib/Prelude.juvix' 'juvix-polysemy typecheck Stdlib/Prelude.juvix' --min-runs 20 Benchmark 1: juvix-effectful typecheck Stdlib/Prelude.juvix Time (mean ± σ): 1.194 s ± 0.068 s [User: 0.979 s, System: 0.211 s] Range (min … max): 1.113 s … 1.307 s 20 runs Benchmark 2: juvix-polysemy typecheck Stdlib/Prelude.juvix Time (mean ± σ): 1.237 s ± 0.083 s [User: 0.997 s, System: 0.231 s] Range (min … max): 1.061 s … 1.476 s 20 runs Summary juvix-effectful typecheck Stdlib/Prelude.juvix ran 1.04 ± 0.09 times faster than juvix-polysemy typecheck Stdlib/Prelude.juvix ```
32 lines
999 B
Haskell
32 lines
999 B
Haskell
module Main (main) where
|
|
|
|
import App
|
|
import CommonOptions
|
|
import Data.String.Interpolate (i)
|
|
import GlobalOptions
|
|
import Juvix.Compiler.Pipeline.Root
|
|
import TopCommand
|
|
import TopCommand.Options
|
|
|
|
main :: IO ()
|
|
main = do
|
|
let parserPreferences = prefs showHelpOnEmpty
|
|
invokeDir <- getCurrentDir
|
|
(_runAppIOArgsGlobalOptions, cli) <- customExecParser parserPreferences descr
|
|
mbuildDir <- mapM (prepathToAbsDir invokeDir) (_runAppIOArgsGlobalOptions ^? globalBuildDir . _Just . pathPath)
|
|
mainFile <- topCommandInputPath cli
|
|
mapM_ checkMainFile mainFile
|
|
runM
|
|
. runTaggedLockPermissive
|
|
$ do
|
|
_runAppIOArgsRoot <- findRootAndChangeDir (containingDir <$> mainFile) mbuildDir invokeDir
|
|
runAppIO RunAppIOArgs {..} (runTopCommand cli)
|
|
where
|
|
checkMainFile :: SomePath b -> IO ()
|
|
checkMainFile p = unlessM (doesSomePathExist p) err
|
|
where
|
|
err :: IO ()
|
|
err = do
|
|
hPutStrLn stderr [i|The input path #{p} does not exist|]
|
|
exitFailure
|