1
+ using System ;
2
+ using System . Drawing ;
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 . TypesEmbedding ;
19
+
20
+ namespace JavaScriptEngineSwitcher . Benchmarks
21
+ {
22
+ [ MemoryDiagnoser ]
23
+ [ Orderer ( SummaryOrderPolicy . Method , MethodOrderPolicy . Declared ) ]
24
+ public class HostTypesEmbeddingBenchmark
25
+ {
26
+ private static void EmbedAndUseHostTypes ( Func < IJsEngine > createJsEngine )
27
+ {
28
+ // Arrange
29
+ var someType = typeof ( SomeClass ) ;
30
+ var pointType = typeof ( Point ) ;
31
+ var someOtherType = typeof ( SomeOtherClass ) ;
32
+
33
+ const string input = @"(function(SomeClass, Point, SomeOtherClass, undefined) {
34
+ var arg1, arg2, arg3, arg4, interimResult, result;
35
+
36
+ SomeClass.Field1 = false;
37
+ SomeClass.Field2 = 678;
38
+ SomeClass.Field3 = 2.20;
39
+ SomeClass.Field4 = 'QWERTY';
40
+ SomeClass.Field5 = new Point(2, 4);
41
+
42
+ SomeClass.Property1 = true;
43
+ SomeClass.Property2 = 711;
44
+ SomeClass.Property3 = 5.5;
45
+ SomeClass.Property4 = 'ЙЦУКЕН';
46
+ SomeClass.Property5 = new SomeOtherClass(true, 611, 69.82, 'ASDF',
47
+ false, 555, 79.99, 'ФЫВА');
48
+
49
+ arg1 = SomeClass.Field1 || SomeClass.Property1;
50
+ arg2 = SomeClass.Field2 + SomeClass.Property2 + SomeClass.Field5.X;
51
+ arg3 = SomeClass.Field3 + SomeClass.Property3 + SomeClass.Field5.Y;
52
+ arg4 = SomeClass.Field4 + SomeClass.Property4;
53
+
54
+ interimResult = SomeClass.DoSomething(arg1, arg2, arg3, arg4);
55
+
56
+ arg1 = SomeClass.Property5.Field1 && SomeClass.Property5.Property1;
57
+ arg2 = interimResult - SomeClass.Property5.Field2 - SomeClass.Property5.Property2;
58
+ arg3 = SomeClass.Property5.Field3 / SomeClass.Property5.Property3;
59
+ arg4 = SomeClass.Property5.Field4 + SomeClass.Property5.Property4;
60
+
61
+ result = SomeOtherClass.DoSomething(arg1, arg2, arg3, arg4);
62
+
63
+ return result;
64
+ }(SomeClass, Point, SomeOtherClass));" ;
65
+ const string targetOutput = "RmFsc2V8MjkyMHwwLjg3Mjg1OTEwNzM4ODQyNHxBU0RG0KTQq9CS0JA=" ;
66
+
67
+ // Act
68
+ string output ;
69
+
70
+ using ( var jsEngine = createJsEngine ( ) )
71
+ {
72
+ jsEngine . EmbedHostType ( "SomeClass" , someType ) ;
73
+ jsEngine . EmbedHostType ( "Point" , pointType ) ;
74
+ jsEngine . EmbedHostType ( "SomeOtherClass" , someOtherType ) ;
75
+
76
+ output = jsEngine . Evaluate < string > ( input ) ;
77
+ }
78
+
79
+ // Assert
80
+ Assert . Equal ( targetOutput , output ) ;
81
+ }
82
+
83
+ [ Benchmark ]
84
+ public void ChakraCore ( )
85
+ {
86
+ Func < IJsEngine > createJsEngine = ( ) => new ChakraCoreJsEngine ( ) ;
87
+ EmbedAndUseHostTypes ( createJsEngine ) ;
88
+ }
89
+
90
+ [ Benchmark ]
91
+ public void Jint ( )
92
+ {
93
+ Func < IJsEngine > createJsEngine = ( ) => new JintJsEngine ( ) ;
94
+ EmbedAndUseHostTypes ( createJsEngine ) ;
95
+ }
96
+
97
+ [ Benchmark ]
98
+ public void Jurassic ( )
99
+ {
100
+ Func < IJsEngine > createJsEngine = ( ) => new JurassicJsEngine ( ) ;
101
+ EmbedAndUseHostTypes ( createJsEngine ) ;
102
+ }
103
+ //#if NET46
104
+
105
+ // [Benchmark]
106
+ // public void MsieClassic()
107
+ // {
108
+ // Func<IJsEngine> createJsEngine = () => new MsieJsEngine(new MsieSettings
109
+ // {
110
+ // EngineMode = JsEngineMode.Classic
111
+ // });
112
+ // EmbedAndUseHostTypes(createJsEngine);
113
+ // }
114
+
115
+ // [Benchmark]
116
+ // public void MsieChakraActiveScript()
117
+ // {
118
+ // Func<IJsEngine> createJsEngine = () => new MsieJsEngine(new MsieSettings
119
+ // {
120
+ // EngineMode = JsEngineMode.ChakraActiveScript
121
+ // });
122
+ // EmbedAndUseHostTypes(createJsEngine);
123
+ // }
124
+ //#endif
125
+ //[Benchmark]
126
+ //public void MsieChakraIeJsRt()
127
+ //{
128
+ // Func<IJsEngine> createJsEngine = () => new MsieJsEngine(new MsieSettings
129
+ // {
130
+ // EngineMode = JsEngineMode.ChakraIeJsRt
131
+ // });
132
+ // EmbedAndUseHostTypes(createJsEngine);
133
+ //}
134
+
135
+ //[Benchmark]
136
+ //public void MsieChakraEdgeJsRt()
137
+ //{
138
+ // Func<IJsEngine> createJsEngine = () => new MsieJsEngine(new MsieSettings
139
+ // {
140
+ // EngineMode = JsEngineMode.ChakraEdgeJsRt
141
+ // });
142
+ // EmbedAndUseHostTypes(createJsEngine);
143
+ //}
144
+
145
+ [ Benchmark ]
146
+ public void NiL ( )
147
+ {
148
+ Func < IJsEngine > createJsEngine = ( ) => new NiLJsEngine ( ) ;
149
+ EmbedAndUseHostTypes ( createJsEngine ) ;
150
+ }
151
+ #if NET46
152
+
153
+ [ Benchmark ]
154
+ public void V8 ( )
155
+ {
156
+ Func < IJsEngine > createJsEngine = ( ) => new V8JsEngine ( ) ;
157
+ EmbedAndUseHostTypes ( createJsEngine ) ;
158
+ }
159
+ #endif
160
+ }
161
+ }
0 commit comments