Skip to content

Commit 09d8d95

Browse files
committed
Program evaluation benchmarks
1 parent ad7822a commit 09d8d95

File tree

6 files changed

+42
-8
lines changed

6 files changed

+42
-8
lines changed

examples/test_fn.lang

+16-2
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,27 @@ let add = fn(x, y) {
22
x + y
33
};
44

5+
let sub = fn(x, y) {
6+
x - y
7+
};
8+
9+
let mul = fn(x, y) {
10+
x * y
11+
};
12+
13+
let div = fn(x, y) {
14+
x / y
15+
};
16+
517
let t = true;
618
let f = false;
719

8-
let res = if(add(1, 2) == 3) {
20+
let res = if(div(20, 2) == 10) {
21+
let f = if(div(500, 10) == 50) { f };
922
!f
1023
} else {
24+
let t = if(mul(5, 5) == 25) { t };
1125
!t
1226
};
1327

14-
res
28+
res

src/interpreter.nim

+3-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import lexer
66
import parser
77
import obj
88
import eval
9+
import util
910

1011
proc evaluate(path: string): string =
1112
result = "Unable to evaluate program!"
@@ -21,7 +22,8 @@ proc evaluate(path: string): string =
2122
parser.check_parser_errors()
2223

2324
var env = obj.environment()
24-
let obj = eval.eval(program, env)
25+
let obj = util.benchmark "program evaluation":
26+
eval.eval(program, env)
2527
if obj != nil:
2628
result = obj.inspect()
2729

src/repl.nim

+3-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import lexer
22
import parser
33
import eval
44
import obj
5+
import util
56

67
type Status {.pure.} = enum
78
stBreak
@@ -33,7 +34,8 @@ proc repl*() =
3334
let program = parser.parse_program()
3435
parser.check_parser_errors()
3536

36-
let obj = eval.eval(program, env)
37+
let obj = util.benchmark "eval repl program":
38+
eval.eval(program, env)
3739
if obj != nil:
3840
echo obj.inspect()
3941

src/util.nim

+17-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,22 @@
1+
import std/times
2+
import std/os
3+
import std/strutils
14

25
template dynamic_cast*[T](root: untyped): untyped =
36
try:
47
T(root)
58
except:
6-
nil
9+
nil
10+
11+
template benchmark*(bench_name: string, statements: untyped): untyped =
12+
block:
13+
let t0 = epochTime()
14+
15+
let result = statements
16+
17+
let t1 = epochTime()
18+
let dt = t1 - t0
19+
let elapsed = strutils.formatFloat(dt, ffDecimal, 5)
20+
echo "CPU Time [", bench_name, "] ", elapsed, "s"
21+
22+
result

tests/test_obj.nim

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import std/unittest
2-
import std/tables
3-
import std/strutils
2+
#import std/tables
3+
#import std/strutils
44

55
import ../src/obj
66

tests/test_parser.nim

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import std/unittest
22
import std/tables
3-
import std/strutils
3+
#import std/strutils
44
import std/typetraits
55

66
import ../src/parser

0 commit comments

Comments
 (0)