Skip to content

Commit 553258d

Browse files
committed
Added a host objects embedding benchmark
1 parent b227c68 commit 553258d

File tree

5 files changed

+214
-2
lines changed

5 files changed

+214
-2
lines changed
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
using System;
2+
using System.Text;
3+
4+
using BenchmarkDotNet.Attributes;
5+
using BenchmarkDotNet.Diagnosers;
6+
using BenchmarkDotNet.Order;
7+
8+
using MsieJavaScriptEngine.Benchmarks.Interop.ObjectsEmbedding;
9+
10+
namespace MsieJavaScriptEngine.Benchmarks
11+
{
12+
[MemoryDiagnoser]
13+
[Orderer(SummaryOrderPolicy.Method, MethodOrderPolicy.Declared)]
14+
public class HostObjectsEmbeddingBenchmark
15+
{
16+
private static void EmbedAndUseHostObjects(Func<MsieJsEngine> createJsEngine)
17+
{
18+
// Arrange
19+
var someObj = new SomeClass();
20+
var logBuilder = new StringBuilder();
21+
Action<string> log = (string value) =>
22+
{
23+
logBuilder.AppendLine(value);
24+
};
25+
26+
const string input = @"(function(someObj, log, undefined) {
27+
var arg1, arg2, arg3, arg4, interimResult, result;
28+
29+
log('-= Start code execution =-');
30+
31+
someObj.Field1 = false;
32+
someObj.Field2 = 678;
33+
someObj.Field3 = 2.20;
34+
someObj.Field4 = 'QWERTY';
35+
someObj.Field5.X = 2;
36+
someObj.Field5.Y = 4;
37+
38+
someObj.Property1 = true;
39+
someObj.Property2 = 711;
40+
someObj.Property3 = 5.5;
41+
someObj.Property4 = 'ЙЦУКЕН';
42+
someObj.Property5.Field1 = true;
43+
someObj.Property5.Field2 = 611;
44+
someObj.Property5.Field3 = 69.82;
45+
someObj.Property5.Field4 = 'ASDF';
46+
someObj.Property5.Property1 = false;
47+
someObj.Property5.Property2 = 555;
48+
someObj.Property5.Property3 = 79.99;
49+
someObj.Property5.Property4 = 'ФЫВА';
50+
51+
arg1 = someObj.Field1 || someObj.Property1;
52+
arg2 = someObj.Field2 + someObj.Property2 + someObj.Field5.X;
53+
arg3 = someObj.Field3 + someObj.Property3 + someObj.Field5.Y;
54+
arg4 = someObj.Field4 + someObj.Property4;
55+
56+
interimResult = someObj.DoSomething(arg1, arg2, arg3, arg4);
57+
58+
arg1 = someObj.Property5.Field1 && someObj.Property5.Property1;
59+
arg2 = interimResult - someObj.Property5.Field2 - someObj.Property5.Property2;
60+
arg3 = someObj.Property5.Field3 / someObj.Property5.Property3;
61+
arg4 = someObj.Property5.Field4 + someObj.Property5.Property4;
62+
63+
result = someObj.Property5.DoSomething(arg1, arg2, arg3, arg4);
64+
65+
log('-= End of code execution =-');
66+
67+
return result;
68+
}(someObj, log));";
69+
const string targetOutput = "RmFsc2V8MjkxNHwwLjg3Mjg1OTEwNzM4ODQyNHxBU0RG0KTQq9CS0JA=";
70+
string targetLogOutput = "-= Start code execution =-" + Environment.NewLine +
71+
"-= End of code execution =-" + Environment.NewLine;
72+
73+
// Act
74+
string output;
75+
string logOutput;
76+
77+
using (var jsEngine = createJsEngine())
78+
{
79+
jsEngine.EmbedHostObject("someObj", someObj);
80+
jsEngine.EmbedHostObject("log", log);
81+
82+
output = jsEngine.Evaluate<string>(input);
83+
84+
logOutput = logBuilder.ToString();
85+
logBuilder.Clear();
86+
}
87+
88+
// Assert
89+
Assert.Equal(targetOutput, output);
90+
Assert.Equal(targetLogOutput, logOutput);
91+
}
92+
#if NET46
93+
94+
[Benchmark]
95+
public void Classic()
96+
{
97+
Func<MsieJsEngine> createJsEngine = () => new MsieJsEngine(new JsEngineSettings{
98+
EngineMode = JsEngineMode.Classic
99+
});
100+
EmbedAndUseHostObjects(createJsEngine);
101+
}
102+
103+
[Benchmark]
104+
public void ChakraActiveScript()
105+
{
106+
Func<MsieJsEngine> createJsEngine = () => new MsieJsEngine(new JsEngineSettings
107+
{
108+
EngineMode = JsEngineMode.ChakraActiveScript
109+
});
110+
EmbedAndUseHostObjects(createJsEngine);
111+
}
112+
#endif
113+
114+
[Benchmark]
115+
public void ChakraIeJsRt()
116+
{
117+
Func<MsieJsEngine> createJsEngine = () => new MsieJsEngine(new JsEngineSettings
118+
{
119+
EngineMode = JsEngineMode.ChakraIeJsRt
120+
});
121+
EmbedAndUseHostObjects(createJsEngine);
122+
}
123+
124+
[Benchmark]
125+
public void ChakraEdgeJsRt()
126+
{
127+
Func<MsieJsEngine> createJsEngine = () => new MsieJsEngine(new JsEngineSettings
128+
{
129+
EngineMode = JsEngineMode.ChakraEdgeJsRt
130+
});
131+
EmbedAndUseHostObjects(createJsEngine);
132+
}
133+
}
134+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
using System;
2+
using System.Drawing;
3+
using System.Linq;
4+
using System.Text;
5+
6+
namespace MsieJavaScriptEngine.Benchmarks.Interop.ObjectsEmbedding
7+
{
8+
public class SomeClass : SomeClassBase
9+
{
10+
public Point Field5;
11+
12+
public SomeOtherClass Property5 { get; set; }
13+
14+
15+
public SomeClass()
16+
{
17+
Field5 = new Point();
18+
19+
Property5 = new SomeOtherClass();
20+
}
21+
22+
23+
public int DoSomething(bool arg1, int arg2, double arg3, string arg4)
24+
{
25+
int result = Convert.ToInt32(arg1) +
26+
arg2 +
27+
(int)Math.Round(arg3) +
28+
Encoding.UTF8.GetBytes(arg4).Sum(x => x);
29+
;
30+
31+
return result;
32+
}
33+
}
34+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using System.Threading.Tasks;
6+
7+
namespace MsieJavaScriptEngine.Benchmarks.Interop.ObjectsEmbedding
8+
{
9+
public abstract class SomeClassBase
10+
{
11+
public bool Field1;
12+
public int Field2;
13+
public double Field3;
14+
public string Field4;
15+
16+
public bool Property1 { get; set; }
17+
public int Property2 { get; set; }
18+
public double Property3 { get; set; }
19+
public string Property4 { get; set; }
20+
}
21+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
using System;
2+
using System.Globalization;
3+
using System.Text;
4+
5+
namespace MsieJavaScriptEngine.Benchmarks.Interop.ObjectsEmbedding
6+
{
7+
public class SomeOtherClass : SomeClassBase
8+
{
9+
public string DoSomething(bool arg1, int arg2, double arg3, string arg4)
10+
{
11+
string rawResult = arg1.ToString(CultureInfo.InvariantCulture) + "|" +
12+
arg2.ToString(CultureInfo.InvariantCulture) + "|" +
13+
arg3.ToString(CultureInfo.InvariantCulture) + "|" +
14+
arg4
15+
;
16+
string result = Convert.ToBase64String(Encoding.UTF8.GetBytes(rawResult));
17+
18+
return result;
19+
}
20+
}
21+
}
Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
1-
using BenchmarkDotNet.Running;
1+
using System.Reflection;
2+
3+
using BenchmarkDotNet.Running;
24

35
namespace MsieJavaScriptEngine.Benchmarks
46
{
57
public static class Program
68
{
79
public static void Main(string[] args)
810
{
9-
BenchmarkRunner.Run<JsExecutionBenchmark>();
11+
BenchmarkSwitcher.FromAssembly(typeof(Program).GetTypeInfo().Assembly).Run(args);
1012
}
1113
}
1214
}

0 commit comments

Comments
 (0)