summaryrefslogtreecommitdiff
path: root/doc/val-optimization.txt
blob: e2342876dcd158817dd8e19b8d0bbdde130e6412 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
Idea: in GFC, represent tables as just lists values, without showing
the parameters.

Concrete syntax: 

  table T [t1 ; ... ; tn]

where t1,...,tn are terms. This is treated as equivalent to

  table {p1 => t1 ; ... ; pn => tn}

where p1,...,pn is the canonical listing of patterns of type T.

Advantage: reduce the size of GFC files.

Disadvantages: you don't get the sharing optimization, e.g.
table {A|B => v} instead of table T [v ; v] 
Moreover, it is slower to select from the table, because
one first has to look up the position index of the argument.

Usage: when compiling a module, use the -val option:

  i -val -src Foo.gf

Summary of results, testing with lib/resource/french/TestVerbesFre.gf:

                              without -val    with -val    ratio
  compilation time                   129 s         84 s     65 %
  time to read back gfcm             109 s         32 s     29 %
  size of generated gfcm              28 M          9 M     32 %
  memory use in compilation          376 M        251 M     67 %
  memory use in reading gfcm        1120 M        524 M     47 %

No significant loss in linearization (which needs selection).

Conclusion: for the case at hand (which prompted the experiment
at the first place), the gain is significant: compilation needs
30 % less resources, and using the compiled grammar needs
50-70 % less.

More testing is desirable to find out if -val is always good.

At the moment, reuse is not possible with gfc modules created
with the -val flag (although it is supported by the GF syntax
already).



10/1/2004

Test the generation of course-of-values tables

---------------------
Without:

  i -src TestVerbesFre.gf
  129160 msec

  > gr -cat=V | l -table
  650 msec

gf +RTS -K10M -s
8,469,778,952 bytes allocated in the heap
2,779,891,252 bytes copied during GC
133,108,856 bytes maximum residency (36 sample(s))

      32295 collections in generation 0 ( 24,25s)
         36 collections in generation 1 ( 24,68s)

        376 Mb total memory in use

  INIT  time    0,01s  (  0,04s elapsed)
  MUT   time   80,21s  (499,76s elapsed)
  GC    time   48,93s  ( 50,01s elapsed)
  EXIT  time    0,00s  (  0,00s elapsed)
  Total time  129,15s  (549,81s elapsed)

  %GC time      37,9%  (9,1% elapsed)

  Alloc rate    105,581,886 bytes per MUT second

  Productivity  62,1% of total user, 14,6% of total elapsed


wc french/*.gfc french/*.gfr
      37     2533    44976 french/CategoriesFre.gfc
       0        9       62 french/ConjugNancy.gfc
       2       29      137 french/MorphoFre.gfc
      29      966     7641 french/NumeralsFre.gfc
     136   393891  4415193 french/RulesFre.gfc
     151     4211    39290 french/StructuralFre.gfc
     123      607     3259 french/SyntaxFre.gfc
     285     4702    59892 french/TestResourceFre.gfc
    6790    27179   184046 french/TestVerbesAbs.gfc
    6781    28170   198376 french/TestVerbesFre.gfc
      20      214     1245 french/TypesFre.gfc
    6494    45458   254878 french/VerbesAbs.gfc
    6494  1272600 23438292 french/VerbesFre.gfc
    6449    45143   209154 french/Vs.gfc
    6278    47836   426316 french/ConjugNancy.gfr
   14465    72471   655006 french/MorphoFre.gfr
  238250   798560  8973600 french/SyntaxFre.gfr
     492     2557    21908 french/TypesFre.gfr
  293276  2747136 38933271 total

pm | wf test0.gfcm
55660 msec

wc test0.gfcm
   28041  1784674 28669416 test0.gfcm

> i test0.gfcm
+ reading test0.gfcm 103290 msec
109450 msec

1120 Mb total memory in use

----------------------
After:


  i -src -val TestVerbesFre.gf
  84650 msec

  gr -cat=V | l -table
  390 msec

gf +RTS -K10M -s
6,061,907,436 bytes allocated in the heap
1,576,739,488 bytes copied during GC
 92,700,188 bytes maximum residency (32 sample(s))

      23109 collections in generation 0 ( 13,98s)
         32 collections in generation 1 ( 12,02s)

        251 Mb total memory in use

  INIT  time    0,01s  (  0,00s elapsed)
  MUT   time   59,28s  (122,35s elapsed)
  GC    time   26,00s  ( 26,91s elapsed)
  EXIT  time    0,00s  (  0,00s elapsed)
  Total time   85,29s  (149,26s elapsed)

  %GC time      30,5%  (18,0% elapsed)

  Alloc rate    102,241,650 bytes per MUT second

  Productivity  69,5% of total user, 39,7% of total elapsed

wc french/*.gfc french/*.gfr
      37     3894    13600 french/CategoriesFre.gfc
       0        9       62 french/ConjugNancy.gfc
       2       29      137 french/MorphoFre.gfc
      29      938     5726 french/NumeralsFre.gfc
     136   354450  3097901 french/RulesFre.gfc
     151     3738    22354 french/StructuralFre.gfc
     123      607     3259 french/SyntaxFre.gfc
     285     2437    18664 french/TestResourceFre.gfc
    6790    27179   184046 french/TestVerbesAbs.gfc
    6781    27694   191696 french/TestVerbesFre.gfc
      20      214     1245 french/TypesFre.gfc
    6494    45458   254878 french/VerbesAbs.gfc
    6494   442149  5078881 french/VerbesFre.gfc
    6449    45143   209154 french/Vs.gfc
    6278    47836   426316 french/ConjugNancy.gfr
   14465    72471   655006 french/MorphoFre.gfr
  238250   798560  8973600 french/SyntaxFre.gfr
     492     2557    21908 french/TypesFre.gfr
  293276  1875363 19158433 total

pm | wf test1.gfcm
13030 msec

wc test1.gfcm
  28041  912901 8894578 test1.gfcm

> i test1.gfcm
+ reading test1.gfcm 24220 msec
32720 msec

524 Mb total memory in use