benches: moved bench in its own directory at project root
[nit.git] / benchmarks / languages / bench_typetest_depth.nit
1 #!/usr/bin/env nit
2
3 # Microbenchmak generation for multiple language
4 # Just a quick an dirty Nit script file :)
5
6 # This benchmark focuses on effects of the hierarchy dept
7 # on the typetest performances
8
9 # class Root
10 # class Klass[E] super Root
11 # class C1...CX super Root
12 # Klass[CX] isa Klass[C1]
13
14 class Klass
15 var id: Int
16 var supers = new Array[Klass]
17 var all_supers = new HashSet[Klass]
18 redef fun to_s
19 do
20 return "C{id}"
21 end
22 end
23
24 class Generator
25
26 var classes = new Array[Klass]
27
28 var dept = 5
29 var loops = 10000
30 var middle = 0
31
32 fun genhier
33 do
34 var s: nullable Klass = null
35 for d in [1..dept] do
36 var c = new Klass(d)
37
38 classes.add(c)
39 c.all_supers.add(c)
40 if s != null then
41 c.supers.add(s)
42 c.all_supers.add_all(s.all_supers)
43 end
44 s = c
45 end
46 middle = (dept + 1) / 2
47 end
48
49 var file: nullable OFStream = null
50 fun write(str: String)
51 do
52 file.write(str)
53 file.write("\n")
54 end
55
56 fun writenit(dir: String, name: String)
57 do
58 dir = "{dir}/nit"
59 dir.mkdir
60 file = new OFStream.open("{dir}/{name}.nit")
61
62 write "class Root\n\tfun id: Int do return 0\nend"
63 for c in classes do
64 write "class {c}[E]"
65 if c.supers.is_empty then
66 write "\tsuper Root"
67 else for s in c.supers do
68 write "\tsuper {s}[E]"
69 end
70 write "\tredef fun id do return {c.id}"
71 write "end"
72 end
73
74 write "var a:{classes.first}[Root] = new {classes.last}[Root]"
75 write "var x = 0"
76 write "for i in [0..{loops}[ do"
77 write "\tfor j in [0..{loops}[ do"
78 write "\t\tif a isa {classes[middle]}[Root] then x += 1"
79 write "\tend"
80 write "end"
81 write "print x"
82
83 file.close
84 end
85
86 fun writejava(dir: String, name: String, interfaces: Bool)
87 do
88 dir = "{dir}/java"
89 dir.mkdir
90 file = new OFStream.open("{dir}/{name}.java")
91
92 var cl = ""
93 if interfaces then cl = "X"
94 write "class {name} \{"
95 if interfaces then
96 write "static interface Root\n\t\{ int id(); \}"
97 else
98 write "static class Root\n\t\{ int id() \{ return 0;\} \}"
99 end
100 for c in classes do
101 if interfaces then
102 write "static interface {c}<E> "
103 else
104 write "static class {c}<E> "
105 end
106 if c.supers.is_empty then
107 write "\textends Root"
108 else for s in [c.supers.first] do
109 write "\textends {s}<E>"
110 end
111 if interfaces then
112 write "\{\}"
113 write "static class X{c}<E> implements {c}<E>"
114 end
115 write "\{"
116 write "\tpublic int id() \{ return {c.id}; \}"
117 write "\}"
118 end
119
120 write "static public void main(String args[]) \{"
121 if interfaces then
122 write "\t{classes.first}<Root> a = new X{classes.last}<Root>();"
123 write "\t{classes.first}<Root> b = new X{classes.last}<Root>();"
124 else
125 write "\t{classes.first}<Root> a = new {classes.last}<Root>();"
126 write "\t{classes.first}<Root> b = new X{classes.last}<Root>();"
127 end
128 write "\ttest(a, b);"
129 write "\}"
130
131 write "static public void test({classes.first}<Root> a, {classes.first}<Root> b) \{"
132 write "\tint x = 0;"
133 write "\tfor(int i = 0; i < {loops}; i++) \{"
134 write "\t\tfor(int j = 0; j < {loops}; j++) \{"
135 write "\t\t\tif(a instanceof {classes[middle]}) \{ x++; \} else \{ a = b; \};"
136 write "\t\t}"
137 write "\t\}"
138 write "\tSystem.out.println(x);"
139 write "\}"
140 write "\}"
141 file.close
142 end
143
144 fun writecsharp(dir: String, name: String, interfaces: Bool)
145 do
146 dir = "{dir}/cs"
147 dir.mkdir
148 file = new OFStream.open("{dir}/{name}.cs")
149
150 var cl = ""
151 if interfaces then cl = "X"
152 write "class {name} \{"
153 if interfaces then
154 write "interface Root\n\t\{ int Id(); \}"
155 else
156 write "class Root\n\t\{ public int Id() \{ return 0;\} \}"
157 end
158 for c in classes do
159 if interfaces then
160 write "interface {c}<E> "
161 else
162 write "class {c}<E> "
163 end
164 if c.supers.is_empty then
165 write "\t: Root"
166 else for s in [c.supers.first] do
167 write "\t: {s}<E>"
168 end
169 if interfaces then
170 write "\{\}"
171 write "class X{c}<E> : {c}<E>"
172 end
173 write "\{"
174 write "\tpublic int Id() \{ return {c.id}; \}"
175 write "\}"
176 end
177
178 write "static void Main(string[] args) \{"
179 if interfaces then
180 write "\t{classes.first}<Root> a = new X{classes.last}<Root>();"
181 write "\t{classes.first}<Root> b = new X{classes.last}<Root>();"
182 else
183 write "\t{classes.first}<Root> a = new {classes.last}<Root>();"
184 write "\t{classes.first}<Root> b = new {classes.last}<Root>();"
185 end
186 write "\tTest(a, b);"
187 write "\}"
188
189 write "static void Test({classes.first}<Root> a, {classes.first}<Root> b) \{"
190 write "\tint x = 0;"
191 write "\tfor(int i = 0; i < {loops}; i++) \{"
192 write "\t\tfor(int j = 0; j < {loops}; j++) \{"
193 write "\t\t\tif(a is {classes[middle]}<Root>) \{ x++; \} else \{ a = b; \};"
194 write "\t\t}"
195 write "\t\}"
196 write "\tSystem.Console.WriteLine(x);"
197 write "\}"
198 write "\}"
199 file.close
200 end
201
202 fun writescala(dir: String, name: String, interfaces: Bool)
203 do
204 dir = "{dir}/scala"
205 dir.mkdir
206 file = new OFStream.open("{dir}/{name}.scala")
207
208 var cl = ""
209 write "object {name} \{"
210 write "class Root\n\t\{ def id: Int = 0 \}"
211 for c in classes do
212 if interfaces then
213 write "trait {c}[E] "
214 else
215 write "class {c}[E] "
216 end
217 if c.supers.is_empty then
218 write "\textends Root"
219 else for s in [c.supers.first] do
220 write "\textends {s}[E]"
221 end
222 if interfaces then
223 write "\{\}"
224 write "class X{c}[E] extends {c}[E]"
225 end
226 write "\{"
227 write "\toverride def id: Int = {c.id}"
228 write "\}"
229 end
230
231 write "def main(args: Array[String]) = \{"
232 if interfaces then
233 write "\tvar a:{classes.first}[Root] = new X{classes.last}[Root]()"
234 write "\tvar b:{classes.first}[Root] = new X{classes.last}[Root]()"
235 else
236 write "\tvar a:{classes.first}[Root] = new {classes.last}[Root]()"
237 write "\tvar b:{classes.first}[Root] = new {classes.last}[Root]()"
238 end
239 write "\ttest(a, b)"
240 write "\}"
241
242 write "def test(a:{classes.first}[Root], b:{classes.first}[Root]) = \{"
243 write "\tvar o = a"
244 write "\tvar x = 0"
245 write "\tfor (i <- 0 to {loops}) \{"
246 write "\t\tfor (j <- 0 to {loops}) \{"
247 write "\t\tif (o.isInstanceOf[{classes[middle]}[Root]]) \{ x = x + 1 \} else \{ o = b \}"
248 write "\t\t\}"
249 write "\t\}"
250 write "\t\t\tprintln(x)"
251 write "\}"
252 write "\}"
253
254 file.close
255 end
256
257 fun writecpp(dir: String, name: String)
258 do
259 dir = "{dir}/cpp"
260 dir.mkdir
261 file = new OFStream.open("{dir}/{name}.cpp")
262
263 write "#include <iostream>"
264 write "#include <stdlib.h>"
265 write "class Root\n\t\{ public: virtual int id() \{ return 0;\} \};"
266 for c in classes do
267 write "template<class E>"
268 write "class {c} "
269 if c.supers.is_empty then
270 write "\t: public virtual Root"
271 else for s in [c.supers.first] do
272 write "\t: public virtual {s}<E>"
273 end
274 write "\{"
275 write "\tpublic: virtual int id() \{ return {c.id}; \}"
276 write "\};"
277 end
278
279 write "void test({classes.first}<Root>* a, {classes.first}<Root>* b) \{"
280 write "\tint x = 0;"
281 write "\tfor(int i = 0; i < {loops}; i++) \{"
282 write "\t\tfor(int j = 0; j < {loops}; j++) \{"
283 write "\t\t\t{classes[middle]}<Root>* to = dynamic_cast<{classes[middle]}<Root>*>(a);"
284 write "\t\tif(to != 0) \{ x++; \} else \{ a = b; \}"
285 write "\t\t}"
286 write "\t\}"
287 write "\tstd::cout << x << std::endl;"
288 write "\}"
289
290 write "int main(int argc, char **argv) \{"
291 write "\t{classes.first}<Root>* a = new {classes.first}<Root>();"
292 write "\t{classes.first}<Root>* b = new {classes.first}<Root>();"
293 write "\ttest(a, b);"
294 write "\}"
295
296 file.close
297 end
298
299 fun writee(dir: String, name: String, se: Bool)
300 do
301 if se then
302 dir = "{dir}/se/{name}"
303 else
304 dir = "{dir}/es/{name}"
305 end
306 dir.mkdir
307 file = new OFStream.open("{dir}/root.e")
308
309 var istk = ""
310 if se then istk = " is"
311 write "class ROOT"
312 write "feature id: INTEGER {istk} do Result := 0 end"
313 write "end"
314 file.close
315
316 for c in classes do
317 file = new OFStream.open("{dir}/{c}.e")
318 write "class {c}[E] "
319 if c.supers.is_empty then
320 write "\tinherit ROOT"
321 else for s in [c.supers.first] do
322 write "\tinherit {s}[E]"
323 end
324 write "\t\tredefine id end"
325 write "feature"
326 write "\tid: INTEGER {istk} do Result := {c.id} end"
327 write "end"
328 file.close
329 end
330
331 file = new OFStream.open("{dir}/app{name}.e")
332 write "class APP{name.to_upper}"
333 if se then
334 write "insert ARGUMENTS"
335 end
336 write "create make"
337 write "feature"
338
339 if se then
340 write "\tmake{istk}"
341 else
342 write "\tmake(args: ARRAY[STRING]){istk}"
343 end
344 write "\t\tlocal"
345 write "\t\t\ta: {classes.first}[ROOT]"
346 write "\t\t\tb: {classes.first}[ROOT]"
347 write "\t\tdo"
348 write "\t\t\tcreate \{{classes.last}[ROOT]\} a"
349 write "\t\t\tcreate \{{classes.last}[ROOT]\} b"
350 write "\t\t\ttest(a, b)"
351 write "\t\tend"
352
353 write "\ttest(a: {classes.first}[ROOT]; b: {classes.first}[ROOT]){istk}"
354 write "\t\tlocal"
355 write "\t\t\to: {classes.first}[ROOT]"
356 write "\t\t\tto: {classes[middle]}[ROOT]"
357 write "\t\t\ti: INTEGER"
358 write "\t\t\tj: INTEGER"
359 write "\t\t\tx: INTEGER"
360 write "\t\tdo"
361 write "\t\t\to := a"
362 write "\t\t\tfrom i := 0 until i>={loops} loop"
363 write "\t\t\t\tfrom j := 0 until j>={loops} loop"
364 write "\t\t\t\t\tto ?= o"
365 write "\t\t\t\t\tif to /= Void then x := x + 1 else o := b end"
366 write "\t\t\t\t\tj := j + 1"
367 write "\t\t\t\tend"
368 write "\t\t\t\ti := i + 1"
369 write "\t\t\tend"
370 write "\t\t\tprint(x.out)"
371 write "\t\tend"
372 write "end"
373 file.close
374 end
375
376 var count = false
377 end
378
379 var g = new Generator
380 var outdir = args.first
381 var name = args[1]
382 var use_interfaces = true
383 if args.length > 2 then g.dept = args[2].to_i
384 if args.length > 3 then use_interfaces = false
385
386 g.genhier
387
388 g.writenit(outdir, name)
389 g.writejava(outdir, name, use_interfaces)
390 g.writecsharp(outdir, name, use_interfaces)
391 g.writescala(outdir, name, use_interfaces)
392 g.writecpp(outdir, name)
393 g.writee(outdir, "{name}_se", true)
394 g.writee(outdir, name, false)