From 968f0081a9e85fe0bb9d9ccfde52624544e2a13a Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Fri, 12 Apr 2013 10:13:35 -0400 Subject: [PATCH] bench/lang: improve bench_typetest_depth Signed-off-by: Jean Privat --- benchmarks/languages/bench_typetest_depth.nit | 178 ++++++++++++++++++------- 1 file changed, 132 insertions(+), 46 deletions(-) diff --git a/benchmarks/languages/bench_typetest_depth.nit b/benchmarks/languages/bench_typetest_depth.nit index 7e4cd43..4257f9e 100644 --- a/benchmarks/languages/bench_typetest_depth.nit +++ b/benchmarks/languages/bench_typetest_depth.nit @@ -26,8 +26,10 @@ class Generator var classes = new Array[Klass] var dept = 5 - var loops = 10000 + var loops = 50000 var middle = 0 + var dry = false + var check = false fun genhier do @@ -71,14 +73,35 @@ class Generator write "end" end - write "var a:{classes.first}[Root] = new {classes.last}[Root]" - write "var x = 0" - write "for i in [0..{loops}[ do" - write "\tfor j in [0..{loops}[ do" - write "\t\tif a isa {classes[middle]}[Root] then x += 1" + write "fun test(a,b: Root, loops, start: Int)" + write "do" + write "var x = start" + write "var i = 0" + write "while i < loops do" + write "\tvar j = 0" + write "\twhile j < loops do" + var test + if dry then test = "" else test = "a isa {classes[middle]}[Root] and " + write "\t\tif {test}x >= 0 then" + if check then write "\t\tx += 1" + write "\telse" + write "\t\t\tx -= 1" + write "\t\t\ta = b" + write "\t\tend" + write "\t\tj += 1" write "\tend" + write "\ti += 1" write "end" write "print x" + write "end" + + write "var a:{classes.first}[Root] = new {classes.last}[Root]" + write "var b:{classes.first}[Root] = new {classes.first}[Root]" + for c in classes do + write "\t\t\tif a.id > 0 then a = new {c}[Root]" + end + write "test(b, b, 10, -100)" + write "test(a, a, {loops}, 0)" file.close end @@ -120,19 +143,30 @@ class Generator write "static public void main(String args[]) \{" if interfaces then write "\t{classes.first} a = new X{classes.last}();" - write "\t{classes.first} b = new X{classes.last}();" + write "\t{classes.first} b = new X{classes.first}();" + for c in classes do + write "\t\t\tif (a.id() > 0) a = new X{c}();" + end else write "\t{classes.first} a = new {classes.last}();" - write "\t{classes.first} b = new X{classes.last}();" + write "\t{classes.first} b = new {classes.first}();" + for c in classes do + write "\t\t\tif (a.id() > 0) a = new {c}();" + end end - write "\ttest(a, b);" + write "\ttest(b, b, 10, -100);" + write "\ttest(a, a, {loops}, 0);" write "\}" - write "static public void test({classes.first} a, {classes.first} b) \{" - write "\tint x = 0;" - write "\tfor(int i = 0; i < {loops}; i++) \{" - write "\t\tfor(int j = 0; j < {loops}; j++) \{" - write "\t\t\tif(a instanceof {classes[middle]}) \{ x++; \} else \{ a = b; \};" + write "static public void test({classes.first} a, {classes.first} b, int loops, int start) \{" + write "\tint x = start;" + write "\tfor(int i = 0; i < loops; i++) \{" + write "\t\tfor(int j = 0; j < loops; j++) \{" + var test + if dry then test = "" else test = "a instanceof {classes[middle]} && " + write "\t\t\tif({test}x>=0) \{" + if check then write "\t\t\t\tx += 1" + write "\t\t\t\} else \{ x--; a = b;\}" write "\t\t}" write "\t\}" write "\tSystem.out.println(x);" @@ -178,19 +212,30 @@ class Generator write "static void Main(string[] args) \{" if interfaces then write "\t{classes.first} a = new X{classes.last}();" - write "\t{classes.first} b = new X{classes.last}();" + write "\t{classes.first} b = new X{classes.first}();" + for c in classes do + write "\t\t\tif (a.Id() > 0) a = new X{c}();" + end else write "\t{classes.first} a = new {classes.last}();" - write "\t{classes.first} b = new {classes.last}();" + write "\t{classes.first} b = new {classes.first}();" + for c in classes do + write "\t\t\tif (a.Id() > 0) a = new {c}();" + end end - write "\tTest(a, b);" + write "\tTest(b, b, 10, -100);" + write "\tTest(a, a, {loops}, 0);" write "\}" - write "static void Test({classes.first} a, {classes.first} b) \{" - write "\tint x = 0;" - write "\tfor(int i = 0; i < {loops}; i++) \{" - write "\t\tfor(int j = 0; j < {loops}; j++) \{" - write "\t\t\tif(a is {classes[middle]}) \{ x++; \} else \{ a = b; \};" + write "static void Test({classes.first} a, {classes.first} b, int loops, int start) \{" + write "\tint x = start;" + write "\tfor(int i = 0; i < loops; i++) \{" + write "\t\tfor(int j = 0; j < loops; j++) \{" + var test + if dry then test = "" else test = "a is {classes[middle]} && " + write "\t\t\tif({test}x>=0) \{" + if check then write "\t\t\t\tx++;" + write "\} else \{ x--; a = b; \};" write "\t\t}" write "\t\}" write "\tSystem.Console.WriteLine(x);" @@ -231,21 +276,37 @@ class Generator write "def main(args: Array[String]) = \{" if interfaces then write "\tvar a:{classes.first}[Root] = new X{classes.last}[Root]()" - write "\tvar b:{classes.first}[Root] = new X{classes.last}[Root]()" + write "\tvar b:{classes.first}[Root] = new X{classes.first}[Root]()" + for c in classes do + write "\t\t\tif (a.id > 0) a = new X{c}[Root]();" + end else write "\tvar a:{classes.first}[Root] = new {classes.last}[Root]()" - write "\tvar b:{classes.first}[Root] = new {classes.last}[Root]()" + write "\tvar b:{classes.first}[Root] = new {classes.first}[Root]()" + for c in classes do + write "\t\t\tif (a.id > 0) a = new {c}[Root]();" + end end - write "\ttest(a, b)" + write "\ttest(b, b, 10, -100)" + write "\ttest(a, a, {loops}, 0)" write "\}" - write "def test(a:{classes.first}[Root], b:{classes.first}[Root]) = \{" - write "\tvar o = a" - write "\tvar x = 0" - write "\tfor (i <- 0 to {loops}) \{" - write "\t\tfor (j <- 0 to {loops}) \{" - write "\t\tif (o.isInstanceOf[{classes[middle]}[Root]]) \{ x = x + 1 \} else \{ o = b \}" + write "def test(aa:{classes.first}[Root], b:{classes.first}[Root], l: Int, start: Int) = \{" + write "\tvar a = aa" + write "\tvar x = start" + write "\tvar loops = l" + write "\tvar i = 0" + write "\twhile (i < loops) \{" + write "\t\tvar j = 0" + write "\t\twhile (j < loops) \{" + var test + if dry then test = "" else test = "a.isInstanceOf[{classes[middle]}[Root]] && " + write "\t\tif ({test}x>=0) \{" + if check then write "\t\t\tx += 1" + write "\} else \{ x = x - 1; a = b; \}" + write "\t\tj += 1" write "\t\t\}" + write "\ti += 1" write "\t\}" write "\t\t\tprintln(x)" write "\}" @@ -276,21 +337,31 @@ class Generator write "\};" end - write "void test({classes.first}* a, {classes.first}* b) \{" - write "\tint x = 0;" - write "\tfor(int i = 0; i < {loops}; i++) \{" - write "\t\tfor(int j = 0; j < {loops}; j++) \{" - write "\t\t\t{classes[middle]}* to = dynamic_cast<{classes[middle]}*>(a);" - write "\t\tif(to != 0) \{ x++; \} else \{ a = b; \}" + write "void test({classes.first}* a, {classes.first}* b, int loops, int start) \{" + write "\tint x = start;" + write "\tfor(int i = 0; i < loops; i++) \{" + write "\t\tfor(int j = 0; j < loops; j++) \{" + var test + if dry then test = "" else + write "\t\t\t{classes[middle]}* to = dynamic_cast<{classes[middle]}*>(a);" + test = "to != 0 &&" + end + write "\t\tif({test}x>=0) \{" + if check then write "\t\t\tx += 1" + write "\} else \{ x--; a = b;\}" write "\t\t}" write "\t\}" write "\tstd::cout << x << std::endl;" write "\}" write "int main(int argc, char **argv) \{" - write "\t{classes.first}* a = new {classes.first}();" + write "\t{classes.first}* a = new {classes.last}();" write "\t{classes.first}* b = new {classes.first}();" - write "\ttest(a, b);" + for c in classes do + write "\t\t\tif (a->id() > 0) a = new {c}();" + end + write "\ttest(b, b, 10, -100);" + write "\ttest(a, a, {loops}, 0);" write "\}" file.close @@ -346,23 +417,38 @@ class Generator write "\t\t\tb: {classes.first}[ROOT]" write "\t\tdo" write "\t\t\tcreate \{{classes.last}[ROOT]\} a" - write "\t\t\tcreate \{{classes.last}[ROOT]\} b" - write "\t\t\ttest(a, b)" + write "\t\t\tcreate \{{classes.first}[ROOT]\} b" + for c in classes do + write "\t\t\tif a.id > 0 then create \{{c}[ROOT]\} a end" + end + write "\t\t\ttest(b, b, 10, -100)" + write "\t\t\ttest(a, a, {loops}, 0)" write "\t\tend" - write "\ttest(a: {classes.first}[ROOT]; b: {classes.first}[ROOT]){istk}" + write "\ttest(a: {classes.first}[ROOT]; b: {classes.first}[ROOT]; l: INTEGER; start: INTEGER){istk}" write "\t\tlocal" write "\t\t\to: {classes.first}[ROOT]" write "\t\t\tto: {classes[middle]}[ROOT]" write "\t\t\ti: INTEGER" write "\t\t\tj: INTEGER" write "\t\t\tx: INTEGER" + write "\t\t\tloops: INTEGER" write "\t\tdo" write "\t\t\to := a" - write "\t\t\tfrom i := 0 until i>={loops} loop" - write "\t\t\t\tfrom j := 0 until j>={loops} loop" - write "\t\t\t\t\tto ?= o" - write "\t\t\t\t\tif to /= Void then x := x + 1 else o := b end" + write "\t\t\tx := start" + write "\t\t\tloops := l" + write "\t\t\tfrom i := 0 until i>=loops loop" + write "\t\t\t\tfrom j := 0 until j>=loops loop" + var test + if dry then + test = "" + else + write "\t\t\t\t\tto ?= o" + test = "to /= Void and then " + end + write "\t\t\t\t\tif {test}x >= 0 then" + if check then write "\t\t\t\t\tx := x + 1" + write "\t\t\t\t\telse x := x - 1; o := b end" write "\t\t\t\t\tj := j + 1" write "\t\t\t\tend" write "\t\t\t\ti := i + 1" -- 1.7.9.5