Skip to content

Commit ca5b3e8

Browse files
committed
Added a host objects embedding benchmark
1 parent 99c53cf commit ca5b3e8

File tree

5 files changed

+255
-2
lines changed

5 files changed

+255
-2
lines changed
Lines changed: 181 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,181 @@
1+
using System;
2+
using System.Text;
3+
4+
using BenchmarkDotNet.Attributes;
5+
using BenchmarkDotNet.Diagnosers;
6+
using BenchmarkDotNet.Order;
7+
8+
using JavaScriptEngineSwitcher.ChakraCore;
9+
using JavaScriptEngineSwitcher.Core;
10+
using JavaScriptEngineSwitcher.Jint;
11+
using JavaScriptEngineSwitcher.Jurassic;
12+
using JavaScriptEngineSwitcher.Msie;
13+
using JavaScriptEngineSwitcher.NiL;
14+
#if NET46
15+
using JavaScriptEngineSwitcher.V8;
16+
#endif
17+
18+
using JavaScriptEngineSwitcher.Benchmarks.Interop.ObjectsEmbedding;
19+
20+
namespace JavaScriptEngineSwitcher.Benchmarks
21+
{
22+
[MemoryDiagnoser]
23+
[Orderer(SummaryOrderPolicy.Method, MethodOrderPolicy.Declared)]
24+
public class HostObjectsEmbeddingBenchmark
25+
{
26+
private static void EmbedAndUseHostObjects(Func<IJsEngine> createJsEngine)
27+
{
28+
// Arrange
29+
var someObj = new SomeClass();
30+
var logBuilder = new StringBuilder();
31+
Action<string> log = (string value) =>
32+
{
33+
logBuilder.AppendLine(value);
34+
};
35+
36+
const string input = @"(function(someObj, log, undefined) {
37+
var arg1, arg2, arg3, arg4, interimResult, result;
38+
39+
log('-= Start code execution =-');
40+
41+
someObj.Field1 = false;
42+
someObj.Field2 = 678;
43+
someObj.Field3 = 2.20;
44+
someObj.Field4 = 'QWERTY';
45+
someObj.Field5.X = 2;
46+
someObj.Field5.Y = 4;
47+
48+
someObj.Property1 = true;
49+
someObj.Property2 = 711;
50+
someObj.Property3 = 5.5;
51+
someObj.Property4 = 'ЙЦУКЕН';
52+
someObj.Property5.Field1 = true;
53+
someObj.Property5.Field2 = 611;
54+
someObj.Property5.Field3 = 69.82;
55+
someObj.Property5.Field4 = 'ASDF';
56+
someObj.Property5.Property1 = false;
57+
someObj.Property5.Property2 = 555;
58+
someObj.Property5.Property3 = 79.99;
59+
someObj.Property5.Property4 = 'ФЫВА';
60+
61+
arg1 = someObj.Field1 || someObj.Property1;
62+
arg2 = someObj.Field2 + someObj.Property2 + someObj.Field5.X;
63+
arg3 = someObj.Field3 + someObj.Property3 + someObj.Field5.Y;
64+
arg4 = someObj.Field4 + someObj.Property4;
65+
66+
interimResult = someObj.DoSomething(arg1, arg2, arg3, arg4);
67+
68+
arg1 = someObj.Property5.Field1 && someObj.Property5.Property1;
69+
arg2 = interimResult - someObj.Property5.Field2 - someObj.Property5.Property2;
70+
arg3 = someObj.Property5.Field3 / someObj.Property5.Property3;
71+
arg4 = someObj.Property5.Field4 + someObj.Property5.Property4;
72+
73+
result = someObj.Property5.DoSomething(arg1, arg2, arg3, arg4);
74+
75+
log('-= End of code execution =-');
76+
77+
return result;
78+
}(someObj, log));";
79+
const string targetOutput = "RmFsc2V8MjkxNHwwLjg3Mjg1OTEwNzM4ODQyNHxBU0RG0KTQq9CS0JA=";
80+
string targetLogOutput = "-= Start code execution =-" + Environment.NewLine +
81+
"-= End of code execution =-" + Environment.NewLine;
82+
83+
// Act
84+
string output;
85+
string logOutput;
86+
87+
using (var jsEngine = createJsEngine())
88+
{
89+
jsEngine.EmbedHostObject("someObj", someObj);
90+
jsEngine.EmbedHostObject("log", log);
91+
92+
output = jsEngine.Evaluate<string>(input);
93+
94+
logOutput = logBuilder.ToString();
95+
logBuilder.Clear();
96+
}
97+
98+
// Assert
99+
Assert.Equal(targetOutput, output);
100+
Assert.Equal(targetLogOutput, logOutput);
101+
}
102+
103+
[Benchmark]
104+
public void ChakraCore()
105+
{
106+
Func<IJsEngine> createJsEngine = () => new ChakraCoreJsEngine();
107+
EmbedAndUseHostObjects(createJsEngine);
108+
}
109+
110+
[Benchmark]
111+
public void Jint()
112+
{
113+
Func<IJsEngine> createJsEngine = () => new JintJsEngine();
114+
EmbedAndUseHostObjects(createJsEngine);
115+
}
116+
117+
[Benchmark]
118+
public void Jurassic()
119+
{
120+
Func<IJsEngine> createJsEngine = () => new JurassicJsEngine();
121+
EmbedAndUseHostObjects(createJsEngine);
122+
}
123+
#if NET46
124+
125+
//[Benchmark]
126+
//public void MsieClassic()
127+
//{
128+
// Func<IJsEngine> createJsEngine = () => new MsieJsEngine(new MsieSettings
129+
// {
130+
// EngineMode = JsEngineMode.Classic
131+
// });
132+
// EmbedAndUseHostObjects(createJsEngine);
133+
//}
134+
135+
[Benchmark]
136+
public void MsieChakraActiveScript()
137+
{
138+
Func<IJsEngine> createJsEngine = () => new MsieJsEngine(new MsieSettings
139+
{
140+
EngineMode = JsEngineMode.ChakraActiveScript
141+
});
142+
EmbedAndUseHostObjects(createJsEngine);
143+
}
144+
#endif
145+
[Benchmark]
146+
public void MsieChakraIeJsRt()
147+
{
148+
Func<IJsEngine> createJsEngine = () => new MsieJsEngine(new MsieSettings
149+
{
150+
EngineMode = JsEngineMode.ChakraIeJsRt
151+
});
152+
EmbedAndUseHostObjects(createJsEngine);
153+
}
154+
155+
[Benchmark]
156+
public void MsieChakraEdgeJsRt()
157+
{
158+
Func<IJsEngine> createJsEngine = () => new MsieJsEngine(new MsieSettings
159+
{
160+
EngineMode = JsEngineMode.ChakraEdgeJsRt
161+
});
162+
EmbedAndUseHostObjects(createJsEngine);
163+
}
164+
165+
[Benchmark]
166+
public void NiL()
167+
{
168+
Func<IJsEngine> createJsEngine = () => new NiLJsEngine();
169+
EmbedAndUseHostObjects(createJsEngine);
170+
}
171+
#if NET46
172+
173+
[Benchmark]
174+
public void V8()
175+
{
176+
Func<IJsEngine> createJsEngine = () => new V8JsEngine();
177+
EmbedAndUseHostObjects(createJsEngine);
178+
}
179+
#endif
180+
}
181+
}
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 JavaScriptEngineSwitcher.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: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
namespace JavaScriptEngineSwitcher.Benchmarks.Interop.ObjectsEmbedding
2+
{
3+
public abstract class SomeClassBase
4+
{
5+
public bool Field1;
6+
public int Field2;
7+
public double Field3;
8+
public string Field4;
9+
10+
public bool Property1 { get; set; }
11+
public int Property2 { get; set; }
12+
public double Property3 { get; set; }
13+
public string Property4 { get; set; }
14+
}
15+
}
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 JavaScriptEngineSwitcher.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 JavaScriptEngineSwitcher.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)