Merge pull request #5300 from roc-lang/benchmark_segfault

improve benchmark error handling, bugfixes
This commit is contained in:
Richard Feldman 2023-05-19 08:05:28 -04:00 committed by GitHub
commit 999e3b6540
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 86 additions and 45 deletions

View file

@ -6,9 +6,10 @@ app "cfold"
# adapted from https://github.com/koka-lang/koka/blob/master/test/bench/haskell/cfold.hs
main : Task.Task {} []
main =
Task.after
Task.getInt
\n ->
inputResult <- Task.attempt Task.getInt
when inputResult is
Ok n ->
e = mkExpr n 1 # original koka n = 20 (set `ulimit -s unlimited` to avoid stack overflow for n = 20)
unoptimized = eval e
optimized = eval (constFolding (reassoc e))
@ -19,6 +20,9 @@ main =
|> Str.concat (Num.toStr optimized)
|> Task.putLine
Err GetIntError ->
Task.putLine "Error: Failed to get Integer from stdin."
Expr : [
Add Expr Expr,
Mul Expr Expr,

View file

@ -8,9 +8,10 @@ IO a : Task.Task a []
main : Task.Task {} []
main =
Task.after
Task.getInt
\n ->
inputResult <- Task.attempt Task.getInt
when inputResult is
Ok n ->
x : Expr
x = Var "x"
@ -20,6 +21,10 @@ main =
nest deriv n f # original koka n = 10
|> Task.map \_ -> {}
Err GetIntError ->
Task.putLine "Error: Failed to get Integer from stdin."
nest : (I64, Expr -> IO Expr), I64, Expr -> IO Expr
nest = \f, n, e -> Task.loop { s: n, f, m: n, x: e } nestHelp

View file

@ -5,32 +5,31 @@ app "nqueens"
main : Task.Task {} []
main =
Task.after
Task.getInt
\n ->
inputResult <- Task.attempt Task.getInt
when inputResult is
Ok n ->
queens n # original koka 13
|> Num.toStr
|> Task.putLine
|> Num.toStr
|> Task.putLine
Err GetIntError ->
Task.putLine "Error: Failed to get Integer from stdin."
ConsList a : [Nil, Cons a (ConsList a)]
queens = \n -> length (findSolutions n n)
length : ConsList a -> I64
length = \xs -> lengthHelp xs 0
findSolutions = \n, k ->
if k <= 0 then # should we use U64 as input type here instead?
Cons Nil Nil
else
extend n Nil (findSolutions n (k - 1))
lengthHelp : ConsList a, I64 -> I64
lengthHelp = \foobar, acc ->
when foobar is
Cons _ lrest -> lengthHelp lrest (1 + acc)
extend = \n, acc, solutions ->
when solutions is
Nil -> acc
safe : I64, I64, ConsList I64 -> Bool
safe = \queen, diagonal, xs ->
when xs is
Nil -> Bool.true
Cons q t ->
queen != q && queen != q + diagonal && queen != q - diagonal && safe queen (diagonal + 1) t
Cons soln rest -> extend n (appendSafe n soln acc) rest
appendSafe : I64, ConsList I64, ConsList (ConsList I64) -> ConsList (ConsList I64)
appendSafe = \k, soln, solns ->
@ -41,13 +40,22 @@ appendSafe = \k, soln, solns ->
else
appendSafe (k - 1) soln solns
extend = \n, acc, solutions ->
when solutions is
Nil -> acc
Cons soln rest -> extend n (appendSafe n soln acc) rest
findSolutions = \n, k ->
if k == 0 then
Cons Nil Nil
else
extend n Nil (findSolutions n (k - 1))
safe : I64, I64, ConsList I64 -> Bool
safe = \queen, diagonal, xs ->
when xs is
Nil -> Bool.true
Cons q t ->
queen != q && queen != q + diagonal && queen != q - diagonal && safe queen (diagonal + 1) t
length : ConsList a -> I64
length = \xs ->
dbg "length"
lengthHelp xs 0
lengthHelp : ConsList a, I64 -> I64
lengthHelp = \foobar, acc ->
when foobar is
Cons _ lrest -> lengthHelp lrest (1 + acc)
Nil -> acc

View file

@ -5,9 +5,10 @@ app "quicksortapp"
main : Task.Task {} []
main =
Task.after
Task.getInt
\n ->
inputResult <- Task.attempt Task.getInt
when inputResult is
Ok n ->
unsortedList =
if n == 0 then
# small unsorted list of 20 elements (0-9)
@ -20,6 +21,10 @@ main =
|> Quicksort.show
|> Task.putLine
Err GetIntError ->
Task.putLine "Error: Failed to get Integer from stdin."
sort : List I64 -> List I64
sort = \list ->
Quicksort.sortWith list (\x, y -> Num.compare x y)

View file

@ -40,9 +40,10 @@ fold = \f, tree, b ->
main : Task.Task {} []
main =
Task.after
Task.getInt
\n ->
inputResult <- Task.attempt Task.getInt
when inputResult is
Ok n ->
# original koka n = 4_200_000
ms : ConsList Map
ms = makeMap 5 n
@ -58,6 +59,9 @@ main =
Nil ->
Task.putLine "fail"
Err GetIntError ->
Task.putLine "Error: Failed to get Integer from stdin."
insert : Tree (Num k) v, Num k, v -> Tree (Num k) v
insert = \t, k, v -> if isRed t then setBlack (ins t k v) else ins t k v

View file

@ -13,9 +13,10 @@ ConsList a : [Nil, Cons a (ConsList a)]
main : Task.Task {} []
main =
Task.after
Task.getInt
\n ->
inputResult <- Task.attempt Task.getInt
when inputResult is
Ok n ->
m = makeMap n # koka original n = 4_200_000
val = fold (\_, v, r -> if v then r + 1 else r) m 0
@ -23,6 +24,10 @@ main =
|> Num.toStr
|> Task.putLine
Err GetIntError ->
Task.putLine "Error: Failed to get Integer from stdin."
boom : Str -> a
boom = \_ -> boom ""

View file

@ -1,5 +1,5 @@
interface Task
exposes [Task, succeed, fail, after, map, putLine, putInt, getInt, forever, loop]
exposes [Task, succeed, fail, after, map, putLine, putInt, getInt, forever, loop, attempt]
imports [pf.Effect]
Task ok err : Effect.Effect (Result ok err)
@ -46,6 +46,15 @@ after = \effect, transform ->
Ok a -> transform a
Err err -> Task.fail err
attempt : Task a b, (Result a b -> Task c d) -> Task c d
attempt = \task, transform ->
Effect.after
task
\result ->
when result is
Ok ok -> transform (Ok ok)
Err err -> transform (Err err)
map : Task a err, (a -> b) -> Task b err
map = \effect, transform ->
Effect.map
@ -61,7 +70,7 @@ putLine = \line -> Effect.map (Effect.putLine line) (\_ -> Ok {})
putInt : I64 -> Task {} *
putInt = \line -> Effect.map (Effect.putInt line) (\_ -> Ok {})
getInt : Task I64 []
getInt : Task I64 [GetIntError]
getInt =
Effect.after
Effect.getInt
@ -69,10 +78,11 @@ getInt =
if
isError
then
# TODO
# when errorCode is
# # A -> Task.fail InvalidCharacter
# # B -> Task.fail IOError
# _ ->
Task.succeed -1
Task.fail GetIntError
else
Task.succeed value