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