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