bench/lang: improve bench_typetest_depth
authorJean Privat <jean@pryen.org>
Fri, 12 Apr 2013 14:13:35 +0000 (10:13 -0400)
committerJean Privat <jean@pryen.org>
Mon, 15 Jul 2013 18:18:48 +0000 (14:18 -0400)
Signed-off-by: Jean Privat <jean@pryen.org>

benchmarks/languages/bench_typetest_depth.nit

index 7e4cd43..4257f9e 100644 (file)
@@ -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}<Root> a = new X{classes.last}<Root>();"
-                       write "\t{classes.first}<Root> b = new X{classes.last}<Root>();"
+                       write "\t{classes.first}<Root> b = 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 "\t{classes.first}<Root> a = new {classes.last}<Root>();"
-                       write "\t{classes.first}<Root> b = new X{classes.last}<Root>();"
+                       write "\t{classes.first}<Root> b = 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 "static public void test({classes.first}<Root> a, {classes.first}<Root> 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}<Root> a, {classes.first}<Root> 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}<Root> a = new X{classes.last}<Root>();"
-                       write "\t{classes.first}<Root> b = new X{classes.last}<Root>();"
+                       write "\t{classes.first}<Root> b = 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 "\t{classes.first}<Root> a = new {classes.last}<Root>();"
-                       write "\t{classes.first}<Root> b = new {classes.last}<Root>();"
+                       write "\t{classes.first}<Root> b = 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 "static void Test({classes.first}<Root> a, {classes.first}<Root> 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]}<Root>) \{ x++; \} else \{ a = b; \};"
+               write "static void Test({classes.first}<Root> a, {classes.first}<Root> 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]}<Root> && "
+               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}<Root>* a, {classes.first}<Root>* 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]}<Root>* to = dynamic_cast<{classes[middle]}<Root>*>(a);"
-               write "\t\tif(to != 0) \{ x++; \} else \{ a = b; \}"
+               write "void test({classes.first}<Root>* a, {classes.first}<Root>* 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]}<Root>* to = dynamic_cast<{classes[middle]}<Root>*>(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}<Root>* a = new {classes.first}<Root>();"
+               write "\t{classes.first}<Root>* a = new {classes.last}<Root>();"
                write "\t{classes.first}<Root>* b = new {classes.first}<Root>();"
-               write "\ttest(a, b);"
+               for c in classes do
+                       write "\t\t\tif (a->id() > 0) a = new {c}<Root>();"
+               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"