4257f9e53302e3b5e8b946646200f7c27b6e9377
3 # Microbenchmak generation for multiple language
4 # Just a quick an dirty Nit script file :)
6 # This benchmark focuses on effects of the hierarchy dept
7 # on the typetest performances
10 # class Klass[E] super Root
11 # class C1...CX super Root
12 # Klass[CX] isa Klass[C1]
16 var supers
= new Array[Klass]
17 var all_supers
= new HashSet[Klass]
26 var classes
= new Array[Klass]
36 var s
: nullable Klass = null
44 c
.all_supers
.add_all
(s
.all_supers
)
48 middle
= (dept
+ 1) / 2
51 var file
: nullable OFStream = null
52 fun write
(str
: String)
58 fun writenit
(dir
: String, name
: String)
62 file
= new OFStream.open
("{dir}/{name}.nit")
64 write
"class Root\n\tfun id: Int do return 0\nend"
67 if c
.supers
.is_empty
then
69 else for s
in c
.supers
do
70 write
"\tsuper {s}[E]"
72 write
"\tredef fun id do return {c.id}"
76 write
"fun test(a,b: Root, loops, start: Int)"
80 write
"while i < loops do"
82 write
"\twhile j < loops do"
84 if dry
then test
= "" else test
= "a isa {classes[middle]}[Root] and "
85 write
"\t\tif {test}x >= 0 then"
86 if check
then write
"\t\tx += 1"
98 write
"var a:{classes.first}[Root] = new {classes.last}[Root]"
99 write
"var b:{classes.first}[Root] = new {classes.first}[Root]"
101 write
"\t\t\tif a.id > 0 then a = new {c}[Root]"
103 write
"test(b, b, 10, -100)"
104 write
"test(a, a, {loops}, 0)"
109 fun writejava
(dir
: String, name
: String, interfaces
: Bool)
113 file
= new OFStream.open
("{dir}/{name}.java")
116 if interfaces
then cl
= "X"
117 write
"class {name} \{"
119 write
"static interface Root\n\t\{ int id(); \}"
121 write
"static class Root\n\t\{ int id() \{ return 0;\} \}"
125 write
"static interface {c}<E> "
127 write
"static class {c}<E> "
129 if c
.supers
.is_empty
then
130 write
"\textends Root"
131 else for s
in [c
.supers
.first
] do
132 write
"\textends {s}<E>"
136 write
"static class X{c}<E> implements {c}<E>"
139 write
"\tpublic int id() \{ return {c.id}; \}"
143 write
"static public void main(String args[]) \{"
145 write
"\t{classes.first}<Root> a = new X{classes.last}<Root>();"
146 write
"\t{classes.first}<Root> b = new X{classes.first}<Root>();"
148 write
"\t\t\tif (a.id() > 0) a = new X{c}<Root>();"
151 write
"\t{classes.first}<Root> a = new {classes.last}<Root>();"
152 write
"\t{classes.first}<Root> b = new {classes.first}<Root>();"
154 write
"\t\t\tif (a.id() > 0) a = new {c}<Root>();"
157 write
"\ttest(b, b, 10, -100);"
158 write
"\ttest(a, a, {loops}, 0);"
161 write
"static public void test({classes.first}<Root> a, {classes.first}<Root> b, int loops, int start) \{"
162 write
"\tint x = start;"
163 write
"\tfor(int i = 0; i < loops; i++) \{"
164 write
"\t\tfor(int j = 0; j < loops; j++) \{"
166 if dry
then test
= "" else test
= "a instanceof {classes[middle]} && "
167 write
"\t\t\tif({test}x>=0) \{"
168 if check
then write
"\t\t\t\tx += 1"
169 write
"\t\t\t\} else \{ x--; a = b;\}"
172 write
"\tSystem.out.println(x);"
178 fun writecsharp
(dir
: String, name
: String, interfaces
: Bool)
182 file
= new OFStream.open
("{dir}/{name}.cs")
185 if interfaces
then cl
= "X"
186 write
"class {name} \{"
188 write
"interface Root\n\t\{ int Id(); \}"
190 write
"class Root\n\t\{ public int Id() \{ return 0;\} \}"
194 write
"interface {c}<E> "
196 write
"class {c}<E> "
198 if c
.supers
.is_empty
then
200 else for s
in [c
.supers
.first
] do
205 write
"class X{c}<E> : {c}<E>"
208 write
"\tpublic int Id() \{ return {c.id}; \}"
212 write
"static void Main(string[] args) \{"
214 write
"\t{classes.first}<Root> a = new X{classes.last}<Root>();"
215 write
"\t{classes.first}<Root> b = new X{classes.first}<Root>();"
217 write
"\t\t\tif (a.Id() > 0) a = new X{c}<Root>();"
220 write
"\t{classes.first}<Root> a = new {classes.last}<Root>();"
221 write
"\t{classes.first}<Root> b = new {classes.first}<Root>();"
223 write
"\t\t\tif (a.Id() > 0) a = new {c}<Root>();"
226 write
"\tTest(b, b, 10, -100);"
227 write
"\tTest(a, a, {loops}, 0);"
230 write
"static void Test({classes.first}<Root> a, {classes.first}<Root> b, int loops, int start) \{"
231 write
"\tint x = start;"
232 write
"\tfor(int i = 0; i < loops; i++) \{"
233 write
"\t\tfor(int j = 0; j < loops; j++) \{"
235 if dry
then test
= "" else test
= "a is {classes[middle]}<Root> && "
236 write
"\t\t\tif({test}x>=0) \{"
237 if check
then write
"\t\t\t\tx++;"
238 write
"\} else \{ x--; a = b; \};"
241 write
"\tSystem.Console.WriteLine(x);"
247 fun writescala
(dir
: String, name
: String, interfaces
: Bool)
251 file
= new OFStream.open
("{dir}/{name}.scala")
254 write
"object {name} \{"
255 write
"class Root\n\t\{ def id: Int = 0 \}"
258 write
"trait {c}[E] "
260 write
"class {c}[E] "
262 if c
.supers
.is_empty
then
263 write
"\textends Root"
264 else for s
in [c
.supers
.first
] do
265 write
"\textends {s}[E]"
269 write
"class X{c}[E] extends {c}[E]"
272 write
"\toverride def id: Int = {c.id}"
276 write
"def main(args: Array[String]) = \{"
278 write
"\tvar a:{classes.first}[Root] = new X{classes.last}[Root]()"
279 write
"\tvar b:{classes.first}[Root] = new X{classes.first}[Root]()"
281 write
"\t\t\tif (a.id > 0) a = new X{c}[Root]();"
284 write
"\tvar a:{classes.first}[Root] = new {classes.last}[Root]()"
285 write
"\tvar b:{classes.first}[Root] = new {classes.first}[Root]()"
287 write
"\t\t\tif (a.id > 0) a = new {c}[Root]();"
290 write
"\ttest(b, b, 10, -100)"
291 write
"\ttest(a, a, {loops}, 0)"
294 write
"def test(aa:{classes.first}[Root], b:{classes.first}[Root], l: Int, start: Int) = \{"
296 write
"\tvar x = start"
297 write
"\tvar loops = l"
299 write
"\twhile (i < loops) \{"
300 write
"\t\tvar j = 0"
301 write
"\t\twhile (j < loops) \{"
303 if dry
then test
= "" else test
= "a.isInstanceOf[{classes[middle]}[Root]] && "
304 write
"\t\tif ({test}x>=0) \{"
305 if check
then write
"\t\t\tx += 1"
306 write
"\} else \{ x = x - 1; a = b; \}"
311 write
"\t\t\tprintln(x)"
318 fun writecpp
(dir
: String, name
: String)
322 file
= new OFStream.open
("{dir}/{name}.cpp")
324 write
"#include <iostream>"
325 write
"#include <stdlib.h>"
326 write
"class Root\n\t\{ public: virtual int id() \{ return 0;\} \};"
328 write
"template<class E>"
330 if c
.supers
.is_empty
then
331 write
"\t: public virtual Root"
332 else for s
in [c
.supers
.first
] do
333 write
"\t: public virtual {s}<E>"
336 write
"\tpublic: virtual int id() \{ return {c.id}; \}"
340 write
"void test({classes.first}<Root>* a, {classes.first}<Root>* b, int loops, int start) \{"
341 write
"\tint x = start;"
342 write
"\tfor(int i = 0; i < loops; i++) \{"
343 write
"\t\tfor(int j = 0; j < loops; j++) \{"
345 if dry
then test
= "" else
346 write
"\t\t\t{classes[middle]}<Root>* to = dynamic_cast<{classes[middle]}<Root>*>(a);"
349 write
"\t\tif({test}x>=0) \{"
350 if check
then write
"\t\t\tx += 1"
351 write
"\} else \{ x--; a = b;\}"
354 write
"\tstd::cout << x << std::endl;"
357 write
"int main(int argc, char **argv) \{"
358 write
"\t{classes.first}<Root>* a = new {classes.last}<Root>();"
359 write
"\t{classes.first}<Root>* b = new {classes.first}<Root>();"
361 write
"\t\t\tif (a->id() > 0) a = new {c}<Root>();"
363 write
"\ttest(b, b, 10, -100);"
364 write
"\ttest(a, a, {loops}, 0);"
370 fun writee
(dir
: String, name
: String, se
: Bool)
373 dir
= "{dir}/se/{name}"
375 dir
= "{dir}/es/{name}"
378 file
= new OFStream.open
("{dir}/root.e")
381 if se
then istk
= " is"
383 write
"feature id: INTEGER {istk} do Result := 0 end"
388 file
= new OFStream.open
("{dir}/{c}.e")
389 write
"class {c}[E] "
390 if c
.supers
.is_empty
then
391 write
"\tinherit ROOT"
392 else for s
in [c
.supers
.first
] do
393 write
"\tinherit {s}[E]"
395 write
"\t\tredefine id end"
397 write
"\tid: INTEGER {istk} do Result := {c.id} end"
402 file
= new OFStream.open
("{dir}/app{name}.e")
403 write
"class APP{name.to_upper}"
405 write
"insert ARGUMENTS"
413 write
"\tmake(args: ARRAY[STRING]){istk}"
416 write
"\t\t\ta: {classes.first}[ROOT]"
417 write
"\t\t\tb: {classes.first}[ROOT]"
419 write
"\t\t\tcreate \{{classes.last}[ROOT]\} a"
420 write
"\t\t\tcreate \{{classes.first}[ROOT]\} b"
422 write
"\t\t\tif a.id > 0 then create \{{c}[ROOT]\} a end"
424 write
"\t\t\ttest(b, b, 10, -100)"
425 write
"\t\t\ttest(a, a, {loops}, 0)"
428 write
"\ttest(a: {classes.first}[ROOT]; b: {classes.first}[ROOT]; l: INTEGER; start: INTEGER){istk}"
430 write
"\t\t\to: {classes.first}[ROOT]"
431 write
"\t\t\tto: {classes[middle]}[ROOT]"
432 write
"\t\t\ti: INTEGER"
433 write
"\t\t\tj: INTEGER"
434 write
"\t\t\tx: INTEGER"
435 write
"\t\t\tloops: INTEGER"
438 write
"\t\t\tx := start"
439 write
"\t\t\tloops := l"
440 write
"\t\t\tfrom i := 0 until i>=loops loop"
441 write
"\t\t\t\tfrom j := 0 until j>=loops loop"
446 write
"\t\t\t\t\tto ?= o"
447 test
= "to /= Void and then "
449 write
"\t\t\t\t\tif {test}x >= 0 then"
450 if check
then write
"\t\t\t\t\tx := x + 1"
451 write
"\t\t\t\t\telse x := x - 1; o := b end"
452 write
"\t\t\t\t\tj := j + 1"
454 write
"\t\t\t\ti := i + 1"
456 write
"\t\t\tprint(x.out)"
465 var g
= new Generator
466 var outdir
= args
.first
468 var use_interfaces
= true
469 if args
.length
> 2 then g
.dept
= args
[2].to_i
470 if args
.length
> 3 then use_interfaces
= false
474 g
.writenit
(outdir
, name
)
475 g
.writejava
(outdir
, name
, use_interfaces
)
476 g
.writecsharp
(outdir
, name
, use_interfaces
)
477 g
.writescala
(outdir
, name
, use_interfaces
)
478 g
.writecpp
(outdir
, name
)
479 g
.writee
(outdir
, "{name}_se", true)
480 g
.writee
(outdir
, name
, false)