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
+ }
0 commit comments