comparison Jint.Runtime/Main.cs @ 3:aced2ae9957f

temp commit, new virtual machine concept (strongly typed version of VM2).
author cin
date Sun, 27 Oct 2013 17:23:25 +0400
parents 4aed85a1f558
children cb13da6e3349
comparison
equal deleted inserted replaced
2:4aed85a1f558 3:aced2ae9957f
1 using System; 1 using System;
2 using Jint.Runtime.VM.OpCodes; 2 using Jint.Runtime.VM;
3 3
4 namespace Jint.Runtime 4 namespace Jint.Runtime
5 { 5 {
6 using VM; 6 using VM;
7 using System.IO; 7 using System.IO;
8 using Jint.Runtime.VM.OpCodes;
8 class MainClass 9 class MainClass
9 { 10 {
10 public static void Main(string[] args) 11 public static void Main(string[] args)
11 { 12 {
12 var runtime = new RuntimeContext (); 13 RuntimeContext runtime = new RuntimeContext();
14 runtime.DefineBinaryOperation<int>(Codes.Add, (x, y) => x + y);
13 15
14 var frame = new Frame (3,runtime); 16 var frame = new Frame(4,runtime);
17 frame.SetValue(2,0);
18 frame.SetValue(3,1);
15 19
16 frame.Set (0, 0); 20 var op = new BinaryOp(Codes.Add, 2, 3, 2);
17 frame.Set (1, 1);
18
19 var op = new Add (0,1,0);
20 21
21 var t = Environment.TickCount; 22 var t = Environment.TickCount;
22 23
23 for(int i=0; i < 10000000; i++) 24 /*
24 op.Invoke (frame); 25 * mov r1, 10 000 000
26 * mov r2, 0
27 * mov r3, 1
28 * loop
29 * condition:
30 * gte r2, r1
31 * body:
32 * add r2,r3,r2
33 */
25 34
26 var res = frame.Get<int> (0); 35 for (int i = 0; i < 10000000; i++)
36 op.Invoke(frame);
27 37
28 Console.WriteLine ("got: {0}, int {1} ms", res, Environment.TickCount - t ); 38 Console.WriteLine ("vm: {0}, int {1} ms", frame.GetValue<int>(2), Environment.TickCount - t );
39
40 t = Environment.TickCount;
41
42 /*
43 * mov r1, 10 000 000
44 * mov r2, 0
45 * mov r3, 1
46 * loop
47 * condition:
48 * gte r2, r1
49 * body:
50 * add r2,r3,r2
51 */
52 object count = 0, inc = 1;
53
54 for (int i = 0; i < 10000000; i++)
55 count = Add(count,inc);
56
57 Console.WriteLine("native: {0}, int {1} ms", frame.GetValue<int>(2), Environment.TickCount - t);
29 58
30 t = Environment.TickCount; 59 t = Environment.TickCount;
31
32 object count = 0, inc = 1;
33 for (int i=0; i< 10000000; i++)
34 count = OpAdd(count,inc);
35
36 Console.WriteLine ("reference results: {0}, int {1} ms", count, Environment.TickCount - t );
37
38 var code = new VM2.Instruction[10000000];
39
40 for (int i = 0; i < code.Length; i++)
41 code[i] = new VM2.Instruction(){ code = VM2.OpCodes.Codes.Add, dest = 0, args = new int[] {0,1} };
42 var machine = new VM2.Machine ();
43
44 t = Environment.TickCount;
45
46 machine.InitFrame (new object[] { 0, 1 });
47 machine.Execute (code);
48
49 Console.WriteLine ("vm2: {0}, int {1} ms", machine.Get(0), Environment.TickCount - t );
50 } 60 }
51 61
52 public static object OpAdd(object arg1, object arg2) { 62 public static object Add(object arg1, object arg2) {
53 if (arg1.GetType () == arg2.GetType ()) { 63 return (int)arg1 + (int)arg2;
54 return OpAddIntegers(arg1,arg2); 64 }
55 }
56 throw new Exception ();
57 }
58
59 public static object OpAddIntegers(object arg1, object arg2) {
60 return (int)arg1 + (int)arg2;
61 }
62 } 65 }
63 } 66 }