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]
34 var s
: nullable Klass = null
42 c
.all_supers
.add_all
(s
.all_supers
)
46 middle
= (dept
+ 1) / 2
49 var file
: nullable OFStream = null
50 fun write
(str
: String)
56 fun writenit
(dir
: String, name
: String)
60 file
= new OFStream.open
("{dir}/{name}.nit")
62 write
"class Root\n\tfun id: Int do return 0\nend"
65 if c
.supers
.is_empty
then
67 else for s
in c
.supers
do
68 write
"\tsuper {s}[E]"
70 write
"\tredef fun id do return {c.id}"
74 write
"var a:{classes.first}[Root] = new {classes.last}[Root]"
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"
86 fun writejava
(dir
: String, name
: String, interfaces
: Bool)
90 file
= new OFStream.open
("{dir}/{name}.java")
93 if interfaces
then cl
= "X"
94 write
"class {name} \{"
96 write
"static interface Root\n\t\{ int id(); \}"
98 write
"static class Root\n\t\{ int id() \{ return 0;\} \}"
102 write
"static interface {c}<E> "
104 write
"static class {c}<E> "
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>"
113 write
"static class X{c}<E> implements {c}<E>"
116 write
"\tpublic int id() \{ return {c.id}; \}"
120 write
"static public void main(String args[]) \{"
122 write
"\t{classes.first}<Root> a = new X{classes.last}<Root>();"
123 write
"\t{classes.first}<Root> b = new X{classes.last}<Root>();"
125 write
"\t{classes.first}<Root> a = new {classes.last}<Root>();"
126 write
"\t{classes.first}<Root> b = new X{classes.last}<Root>();"
128 write
"\ttest(a, b);"
131 write
"static public void test({classes.first}<Root> a, {classes.first}<Root> b) \{"
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; \};"
138 write
"\tSystem.out.println(x);"
144 fun writecsharp
(dir
: String, name
: String, interfaces
: Bool)
148 file
= new OFStream.open
("{dir}/{name}.cs")
151 if interfaces
then cl
= "X"
152 write
"class {name} \{"
154 write
"interface Root\n\t\{ int Id(); \}"
156 write
"class Root\n\t\{ public int Id() \{ return 0;\} \}"
160 write
"interface {c}<E> "
162 write
"class {c}<E> "
164 if c
.supers
.is_empty
then
166 else for s
in [c
.supers
.first
] do
171 write
"class X{c}<E> : {c}<E>"
174 write
"\tpublic int Id() \{ return {c.id}; \}"
178 write
"static void Main(string[] args) \{"
180 write
"\t{classes.first}<Root> a = new X{classes.last}<Root>();"
181 write
"\t{classes.first}<Root> b = new X{classes.last}<Root>();"
183 write
"\t{classes.first}<Root> a = new {classes.last}<Root>();"
184 write
"\t{classes.first}<Root> b = new {classes.last}<Root>();"
186 write
"\tTest(a, b);"
189 write
"static void Test({classes.first}<Root> a, {classes.first}<Root> b) \{"
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; \};"
196 write
"\tSystem.Console.WriteLine(x);"
202 fun writescala
(dir
: String, name
: String, interfaces
: Bool)
206 file
= new OFStream.open
("{dir}/{name}.scala")
209 write
"object {name} \{"
210 write
"class Root\n\t\{ def id: Int = 0 \}"
213 write
"trait {c}[E] "
215 write
"class {c}[E] "
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]"
224 write
"class X{c}[E] extends {c}[E]"
227 write
"\toverride def id: Int = {c.id}"
231 write
"def main(args: Array[String]) = \{"
233 write
"\tvar a:{classes.first}[Root] = new X{classes.last}[Root]()"
234 write
"\tvar b:{classes.first}[Root] = new X{classes.last}[Root]()"
236 write
"\tvar a:{classes.first}[Root] = new {classes.last}[Root]()"
237 write
"\tvar b:{classes.first}[Root] = new {classes.last}[Root]()"
242 write
"def test(a:{classes.first}[Root], b:{classes.first}[Root]) = \{"
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 \}"
250 write
"\t\t\tprintln(x)"
257 fun writecpp
(dir
: String, name
: String)
261 file
= new OFStream.open
("{dir}/{name}.cpp")
263 write
"#include <iostream>"
264 write
"#include <stdlib.h>"
265 write
"class Root\n\t\{ public: virtual int id() \{ return 0;\} \};"
267 write
"template<class E>"
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>"
275 write
"\tpublic: virtual int id() \{ return {c.id}; \}"
279 write
"void test({classes.first}<Root>* a, {classes.first}<Root>* b) \{"
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; \}"
287 write
"\tstd::cout << x << std::endl;"
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);"
299 fun writee
(dir
: String, name
: String, se
: Bool)
302 dir
= "{dir}/se/{name}"
304 dir
= "{dir}/es/{name}"
307 file
= new OFStream.open
("{dir}/root.e")
310 if se
then istk
= " is"
312 write
"feature id: INTEGER {istk} do Result := 0 end"
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]"
324 write
"\t\tredefine id end"
326 write
"\tid: INTEGER {istk} do Result := {c.id} end"
331 file
= new OFStream.open
("{dir}/app{name}.e")
332 write
"class APP{name.to_upper}"
334 write
"insert ARGUMENTS"
342 write
"\tmake(args: ARRAY[STRING]){istk}"
345 write
"\t\t\ta: {classes.first}[ROOT]"
346 write
"\t\t\tb: {classes.first}[ROOT]"
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)"
353 write
"\ttest(a: {classes.first}[ROOT]; b: {classes.first}[ROOT]){istk}"
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"
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"
368 write
"\t\t\t\ti := i + 1"
370 write
"\t\t\tprint(x.out)"
379 var g
= new Generator
380 var outdir
= args
.first
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
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)