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