1+ using System ;
2+ using System . Text ;
3+
4+ using BenchmarkDotNet . Attributes ;
5+ using BenchmarkDotNet . Diagnosers ;
6+ using BenchmarkDotNet . Order ;
7+
8+ using MsieJavaScriptEngine . Benchmarks . Interop . ObjectsEmbedding ;
9+
10+ namespace MsieJavaScriptEngine . Benchmarks
11+ {
12+ [ MemoryDiagnoser ]
13+ [ Orderer ( SummaryOrderPolicy . Method , MethodOrderPolicy . Declared ) ]
14+ public class HostObjectsEmbeddingBenchmark
15+ {
16+ private static void EmbedAndUseHostObjects ( Func < MsieJsEngine > createJsEngine )
17+ {
18+ // Arrange
19+ var someObj = new SomeClass ( ) ;
20+ var logBuilder = new StringBuilder ( ) ;
21+ Action < string > log = ( string value ) =>
22+ {
23+ logBuilder . AppendLine ( value ) ;
24+ } ;
25+
26+ const string input = @"(function(someObj, log, undefined) {
27+ var arg1, arg2, arg3, arg4, interimResult, result;
28+
29+ log('-= Start code execution =-');
30+
31+ someObj.Field1 = false;
32+ someObj.Field2 = 678;
33+ someObj.Field3 = 2.20;
34+ someObj.Field4 = 'QWERTY';
35+ someObj.Field5.X = 2;
36+ someObj.Field5.Y = 4;
37+
38+ someObj.Property1 = true;
39+ someObj.Property2 = 711;
40+ someObj.Property3 = 5.5;
41+ someObj.Property4 = 'ЙЦУКЕН';
42+ someObj.Property5.Field1 = true;
43+ someObj.Property5.Field2 = 611;
44+ someObj.Property5.Field3 = 69.82;
45+ someObj.Property5.Field4 = 'ASDF';
46+ someObj.Property5.Property1 = false;
47+ someObj.Property5.Property2 = 555;
48+ someObj.Property5.Property3 = 79.99;
49+ someObj.Property5.Property4 = 'ФЫВА';
50+
51+ arg1 = someObj.Field1 || someObj.Property1;
52+ arg2 = someObj.Field2 + someObj.Property2 + someObj.Field5.X;
53+ arg3 = someObj.Field3 + someObj.Property3 + someObj.Field5.Y;
54+ arg4 = someObj.Field4 + someObj.Property4;
55+
56+ interimResult = someObj.DoSomething(arg1, arg2, arg3, arg4);
57+
58+ arg1 = someObj.Property5.Field1 && someObj.Property5.Property1;
59+ arg2 = interimResult - someObj.Property5.Field2 - someObj.Property5.Property2;
60+ arg3 = someObj.Property5.Field3 / someObj.Property5.Property3;
61+ arg4 = someObj.Property5.Field4 + someObj.Property5.Property4;
62+
63+ result = someObj.Property5.DoSomething(arg1, arg2, arg3, arg4);
64+
65+ log('-= End of code execution =-');
66+
67+ return result;
68+ }(someObj, log));" ;
69+ const string targetOutput = "RmFsc2V8MjkxNHwwLjg3Mjg1OTEwNzM4ODQyNHxBU0RG0KTQq9CS0JA=" ;
70+ string targetLogOutput = "-= Start code execution =-" + Environment . NewLine +
71+ "-= End of code execution =-" + Environment . NewLine ;
72+
73+ // Act
74+ string output ;
75+ string logOutput ;
76+
77+ using ( var jsEngine = createJsEngine ( ) )
78+ {
79+ jsEngine . EmbedHostObject ( "someObj" , someObj ) ;
80+ jsEngine . EmbedHostObject ( "log" , log ) ;
81+
82+ output = jsEngine . Evaluate < string > ( input ) ;
83+
84+ logOutput = logBuilder . ToString ( ) ;
85+ logBuilder . Clear ( ) ;
86+ }
87+
88+ // Assert
89+ Assert . Equal ( targetOutput , output ) ;
90+ Assert . Equal ( targetLogOutput , logOutput ) ;
91+ }
92+ #if NET46
93+
94+ [ Benchmark ]
95+ public void Classic ( )
96+ {
97+ Func < MsieJsEngine > createJsEngine = ( ) => new MsieJsEngine ( new JsEngineSettings {
98+ EngineMode = JsEngineMode . Classic
99+ } ) ;
100+ EmbedAndUseHostObjects ( createJsEngine ) ;
101+ }
102+
103+ [ Benchmark ]
104+ public void ChakraActiveScript ( )
105+ {
106+ Func < MsieJsEngine > createJsEngine = ( ) => new MsieJsEngine ( new JsEngineSettings
107+ {
108+ EngineMode = JsEngineMode . ChakraActiveScript
109+ } ) ;
110+ EmbedAndUseHostObjects ( createJsEngine ) ;
111+ }
112+ #endif
113+
114+ [ Benchmark ]
115+ public void ChakraIeJsRt ( )
116+ {
117+ Func < MsieJsEngine > createJsEngine = ( ) => new MsieJsEngine ( new JsEngineSettings
118+ {
119+ EngineMode = JsEngineMode . ChakraIeJsRt
120+ } ) ;
121+ EmbedAndUseHostObjects ( createJsEngine ) ;
122+ }
123+
124+ [ Benchmark ]
125+ public void ChakraEdgeJsRt ( )
126+ {
127+ Func < MsieJsEngine > createJsEngine = ( ) => new MsieJsEngine ( new JsEngineSettings
128+ {
129+ EngineMode = JsEngineMode . ChakraEdgeJsRt
130+ } ) ;
131+ EmbedAndUseHostObjects ( createJsEngine ) ;
132+ }
133+ }
134+ }
0 commit comments