@@ -33,6 +33,12 @@ var input = `
33
33
fibonacci(35);
34
34
`
35
35
36
+ type benchResults struct {
37
+ engine string
38
+ result object.Object
39
+ duration time.Duration
40
+ }
41
+
36
42
func main () {
37
43
flag .Parse ()
38
44
@@ -54,17 +60,29 @@ func main() {
54
60
} else if * engine == "eval" {
55
61
timeEval (program )
56
62
} else {
57
- timeEval (program )
58
- timeVM (program )
63
+ results := make (chan benchResults )
64
+ go func () {
65
+ fmt .Println ("Running eval" )
66
+ result := timeEval (program )
67
+ results <- result
68
+ }()
69
+ go func () {
70
+ fmt .Println ("Running vm" )
71
+ result := timeVM (program )
72
+ results <- result
73
+ }()
74
+
75
+ printResult (<- results )
76
+ printResult (<- results )
59
77
}
60
78
}
61
79
62
- func timeVM (program * ast.Program ) {
80
+ func timeVM (program * ast.Program ) benchResults {
63
81
comp := compiler .New ()
64
82
err := comp .Compile (program )
65
83
if err != nil {
66
84
fmt .Printf ("compiler error: %s" , err )
67
- return
85
+ return benchResults {}
68
86
}
69
87
70
88
machine := vm .New (comp .Bytecode ())
@@ -74,27 +92,25 @@ func timeVM(program *ast.Program) {
74
92
err = machine .Run ()
75
93
if err != nil {
76
94
fmt .Printf ("vm error: %s" , err )
77
- return
95
+ return benchResults {}
78
96
}
79
97
80
98
duration := time .Since (start )
81
99
result := machine .LastPoppedStackElem ()
82
-
83
- printResult ("vm" , result , duration )
100
+ return benchResults {engine : "vm" , result : result , duration : duration }
84
101
}
85
102
86
- func timeEval (program * ast.Program ) {
103
+ func timeEval (program * ast.Program ) benchResults {
87
104
env := object .NewEnvironment ()
88
105
start := time .Now ()
89
106
result := evaluator .Eval (program , env )
90
107
duration := time .Since (start )
91
-
92
- printResult ("eval" , result , duration )
108
+ return benchResults {engine : "eval" , result : result , duration : duration }
93
109
}
94
110
95
- func printResult (engine string , result object. Object , duration time. Duration ) {
111
+ func printResult (result benchResults ) {
96
112
fmt .Printf ("--> engine=%s, result=%s, duration=%s\n " ,
97
- engine ,
98
- result .Inspect (),
99
- duration )
113
+ result . engine ,
114
+ result .result . Inspect (),
115
+ result . duration )
100
116
}
0 commit comments