Skip to content

Commit af5657d

Browse files
authored
[ performance ] Memoise toplevel constants (#1899)
* [ performance ] memoize toplevel constants * [ test ] memoization tests * [ fix ] fix blodwen-lazy for racket and gambit
1 parent 6780874 commit af5657d

File tree

13 files changed

+195
-0
lines changed

13 files changed

+195
-0
lines changed

src/Compiler/Scheme/Common.idr

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -659,6 +659,9 @@ parameters (schExtPrim : Int -> ExtPrim -> List NamedCExp -> Core String,
659659

660660
schDef : {auto c : Ref Ctxt Defs} ->
661661
Name -> NamedDef -> Core String
662+
schDef n (MkNmFun [] exp)
663+
= pure $ "(define " ++ schName !(getFullName n) ++ "(blodwen-lazy (lambda () "
664+
++ !(schExp 0 exp) ++ ")))\n"
662665
schDef n (MkNmFun args exp)
663666
= pure $ "(define " ++ schName !(getFullName n) ++ " (lambda (" ++ schArglist args ++ ") "
664667
++ !(schExp 0 exp) ++ "))\n"

support/chez/support.ss

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,17 @@
88
[(i3nt ti3nt a6nt ta6nt) "windows"]
99
[else "unknown"]))
1010

11+
(define blodwen-lazy
12+
(lambda (f)
13+
(let ([evaluated #f] [res void])
14+
(lambda ()
15+
(if (not evaluated)
16+
(begin (set! evaluated #t)
17+
(set! res (f))
18+
(set! f void))
19+
(void))
20+
res))))
21+
1122
(define blodwen-toSignedInt
1223
(lambda (x bits)
1324
(if (logbit? bits x)
@@ -18,6 +29,7 @@
1829
(lambda (x bits)
1930
(modulo x (ash 1 bits))))
2031

32+
2133
(define bu+ (lambda (x y bits) (blodwen-toUnsignedInt (+ x y) bits)))
2234
(define bu- (lambda (x y bits) (blodwen-toUnsignedInt (- x y) bits)))
2335
(define bu* (lambda (x y bits) (blodwen-toUnsignedInt (* x y) bits)))

support/gambit/support.scm

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,17 @@
1414
(cons (vector-ref desc 2)
1515
(blodwen-read-args (vector-ref desc 3)))))
1616

17+
(define blodwen-lazy
18+
(lambda (f)
19+
(let ([evaluated #f] [res void])
20+
(lambda ()
21+
(if (not evaluated)
22+
(begin (set! evaluated #t)
23+
(set! res (f))
24+
(set! f void))
25+
(void))
26+
res))))
27+
1728
(define blodwen-toSignedInt
1829
(lambda (x bits)
1930
(if (bit-set? bits x)

support/racket/support.rkt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,17 @@
55
[(windows) "windows"]
66
[else "unknown"]))
77

8+
(define blodwen-lazy
9+
(lambda (f)
10+
(let ([evaluated #f] [res void])
11+
(lambda ()
12+
(if (not evaluated)
13+
(begin (set! evaluated #t)
14+
(set! res (f))
15+
(set! f void))
16+
(void))
17+
res))))
18+
819
(define blodwen-toSignedInt
920
(lambda (x bits)
1021
(if (bitwise-bit-set? x bits)

tests/Main.idr

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,7 @@ chezTests = MkTestPool "Chez backend" [] (Just Chez)
226226
, "futures001"
227227
, "bitops"
228228
, "casts"
229+
, "memo"
229230
, "newints"
230231
, "integers"
231232
, "semaphores001"
@@ -261,6 +262,7 @@ nodeTests = MkTestPool "Node backend" [] (Just Node)
261262
, "args"
262263
, "bitops"
263264
, "casts"
265+
, "memo"
264266
, "newints"
265267
, "reg001"
266268
, "syntax001"

tests/chez/memo/Memo.idr

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
-- This tests checks, whether toplevel constants are
2+
-- properly memoized. If they are not, this test
3+
-- will perform 10^20 additions and will therefore not
4+
-- finish in reasonable time.
5+
n0 : Nat
6+
n0 = 1
7+
8+
n1 : Nat
9+
n1 = n0 + n0 + n0 + n0 + n0 + n0 + n0 + n0 + n0 + n0
10+
11+
n2 : Nat
12+
n2 = n1 + n1 + n1 + n1 + n1 + n1 + n1 + n1 + n1 + n1
13+
14+
n3 : Nat
15+
n3 = n2 + n2 + n2 + n2 + n2 + n2 + n2 + n2 + n2 + n2
16+
17+
n4 : Nat
18+
n4 = n3 + n3 + n3 + n3 + n3 + n3 + n3 + n3 + n3 + n3
19+
20+
n5 : Nat
21+
n5 = n4 + n4 + n4 + n4 + n4 + n4 + n4 + n4 + n4 + n4
22+
23+
n6 : Nat
24+
n6 = n5 + n5 + n5 + n5 + n5 + n5 + n5 + n5 + n5 + n5
25+
26+
n7 : Nat
27+
n7 = n6 + n6 + n6 + n6 + n6 + n6 + n6 + n6 + n6 + n6
28+
29+
n8 : Nat
30+
n8 = n7 + n7 + n7 + n7 + n7 + n7 + n7 + n7 + n7 + n7
31+
32+
n9 : Nat
33+
n9 = n8 + n8 + n8 + n8 + n8 + n8 + n8 + n8 + n8 + n8
34+
35+
n10 : Nat
36+
n10 = n9 + n9 + n9 + n9 + n9 + n9 + n9 + n9 + n9 + n9
37+
38+
n11 : Nat
39+
n11 = n10 + n10 + n10 + n10 + n10 + n10 + n10 + n10 + n10 + n10
40+
41+
n12 : Nat
42+
n12 = n11 + n11 + n11 + n11 + n11 + n11 + n11 + n11 + n11 + n11
43+
44+
n13 : Nat
45+
n13 = n12 + n12 + n12 + n12 + n12 + n12 + n12 + n12 + n12 + n12
46+
47+
n14 : Nat
48+
n14 = n13 + n13 + n13 + n13 + n13 + n13 + n13 + n13 + n13 + n13
49+
50+
n15 : Nat
51+
n15 = n14 + n14 + n14 + n14 + n14 + n14 + n14 + n14 + n14 + n14
52+
53+
n16 : Nat
54+
n16 = n15 + n15 + n15 + n15 + n15 + n15 + n15 + n15 + n15 + n15
55+
56+
n17 : Nat
57+
n17 = n16 + n16 + n16 + n16 + n16 + n16 + n16 + n16 + n16 + n16
58+
59+
n18 : Nat
60+
n18 = n17 + n17 + n17 + n17 + n17 + n17 + n17 + n17 + n17 + n17
61+
62+
n19 : Nat
63+
n19 = n18 + n18 + n18 + n18 + n18 + n18 + n18 + n18 + n18 + n18
64+
65+
n20 : Nat
66+
n20 = n19 + n19 + n19 + n19 + n19 + n19 + n19 + n19 + n19 + n19
67+
68+
main : IO ()
69+
main = do printLn n20

tests/chez/memo/expected

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
1/1: Building Memo (Memo.idr)
2+
Main> 100000000000000000000
3+
Main> Bye for now!

tests/chez/memo/input

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
:exec main
2+
:q

tests/chez/memo/run

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
rm -rf build
2+
3+
$1 --no-banner --no-color --console-width 0 Memo.idr < input
4+

tests/node/memo/Memo.idr

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
-- This tests checks, whether toplevel constants are
2+
-- properly memoized. If they are not, this test
3+
-- will perform 10^20 additions and will therefore not
4+
-- finish in reasonable time.
5+
n0 : Nat
6+
n0 = 1
7+
8+
n1 : Nat
9+
n1 = n0 + n0 + n0 + n0 + n0 + n0 + n0 + n0 + n0 + n0
10+
11+
n2 : Nat
12+
n2 = n1 + n1 + n1 + n1 + n1 + n1 + n1 + n1 + n1 + n1
13+
14+
n3 : Nat
15+
n3 = n2 + n2 + n2 + n2 + n2 + n2 + n2 + n2 + n2 + n2
16+
17+
n4 : Nat
18+
n4 = n3 + n3 + n3 + n3 + n3 + n3 + n3 + n3 + n3 + n3
19+
20+
n5 : Nat
21+
n5 = n4 + n4 + n4 + n4 + n4 + n4 + n4 + n4 + n4 + n4
22+
23+
n6 : Nat
24+
n6 = n5 + n5 + n5 + n5 + n5 + n5 + n5 + n5 + n5 + n5
25+
26+
n7 : Nat
27+
n7 = n6 + n6 + n6 + n6 + n6 + n6 + n6 + n6 + n6 + n6
28+
29+
n8 : Nat
30+
n8 = n7 + n7 + n7 + n7 + n7 + n7 + n7 + n7 + n7 + n7
31+
32+
n9 : Nat
33+
n9 = n8 + n8 + n8 + n8 + n8 + n8 + n8 + n8 + n8 + n8
34+
35+
n10 : Nat
36+
n10 = n9 + n9 + n9 + n9 + n9 + n9 + n9 + n9 + n9 + n9
37+
38+
n11 : Nat
39+
n11 = n10 + n10 + n10 + n10 + n10 + n10 + n10 + n10 + n10 + n10
40+
41+
n12 : Nat
42+
n12 = n11 + n11 + n11 + n11 + n11 + n11 + n11 + n11 + n11 + n11
43+
44+
n13 : Nat
45+
n13 = n12 + n12 + n12 + n12 + n12 + n12 + n12 + n12 + n12 + n12
46+
47+
n14 : Nat
48+
n14 = n13 + n13 + n13 + n13 + n13 + n13 + n13 + n13 + n13 + n13
49+
50+
n15 : Nat
51+
n15 = n14 + n14 + n14 + n14 + n14 + n14 + n14 + n14 + n14 + n14
52+
53+
n16 : Nat
54+
n16 = n15 + n15 + n15 + n15 + n15 + n15 + n15 + n15 + n15 + n15
55+
56+
n17 : Nat
57+
n17 = n16 + n16 + n16 + n16 + n16 + n16 + n16 + n16 + n16 + n16
58+
59+
n18 : Nat
60+
n18 = n17 + n17 + n17 + n17 + n17 + n17 + n17 + n17 + n17 + n17
61+
62+
n19 : Nat
63+
n19 = n18 + n18 + n18 + n18 + n18 + n18 + n18 + n18 + n18 + n18
64+
65+
n20 : Nat
66+
n20 = n19 + n19 + n19 + n19 + n19 + n19 + n19 + n19 + n19 + n19
67+
68+
main : IO ()
69+
main = do printLn n20

0 commit comments

Comments
 (0)