1- // Copyright (C) 2003-2010 Xtensive LLC.
2- // All rights reserved .
3- // For conditions of distribution and use, see license .
1+ // Copyright (C) 2008-2021 Xtensive LLC.
2+ // This code is distributed under MIT license terms .
3+ // See the License.txt file in the project root for more information .
44// Created by: Alex Yakunin
55// Created: 2008.06.05
66
77using System ;
88using NUnit . Framework ;
99using Xtensive . Comparison ;
10- using Xtensive . Core ;
11- using Xtensive . Tuples ;
12- using Xtensive . Orm . Tests ;
1310using Xtensive . Tuples . Transform ;
14- using Tuple = Xtensive . Tuples . Tuple ;
1511
1612namespace Xtensive . Orm . Tests . Core . Tuples . Transform
1713{
1814 [ TestFixture ]
1915 public class MergeTransformTest
2016 {
21- public const int IterationCount = 1000000 ;
17+ private const int IterationCount = 1_000_000 ;
18+ private const int MeasurementRuns = 5 ;
2219
2320 [ Test ]
2421 public void BaseTest ( )
@@ -27,8 +24,8 @@ public void BaseTest()
2724 Xtensive . Tuples . Tuple t2 = Xtensive . Tuples . Tuple . Create ( 3 , 4.0 , "5" ) ;
2825 TestLog . Info ( $ "Originals: { t1 } , { t2 } ") ;
2926
30- CombineTransform mt = new CombineTransform ( false , t1 . Descriptor , t2 . Descriptor ) ;
31- CombineTransform mtro = new CombineTransform ( true , t1 . Descriptor , t2 . Descriptor ) ;
27+ ConcatTransform mt = new ConcatTransform ( false , t1 . Descriptor , t2 . Descriptor ) ;
28+ ConcatTransform mtro = new ConcatTransform ( true , t1 . Descriptor , t2 . Descriptor ) ;
3229
3330 Xtensive . Tuples . Tuple wt1 = mt . Apply ( TupleTransformType . TransformedTuple , t1 , t2 ) ;
3431 TestLog . Info ( $ "Wrapper: { wt1 } ") ;
@@ -57,34 +54,27 @@ public void BaseTest()
5754 AssertEx . Throws < NotSupportedException > ( delegate {
5855 wtro . SetValue ( 2 , 0 ) ;
5956 } ) ;
57+ }
58+
59+ [ Test ]
60+ public void ToStringTest ( )
61+ {
62+ Xtensive . Tuples . Tuple t1 = Xtensive . Tuples . Tuple . Create ( 1 , "2" ) ;
63+ Xtensive . Tuples . Tuple t2 = Xtensive . Tuples . Tuple . Create ( 3 , 4.0 , "5" ) ;
64+
65+ var ct = new ConcatTransform ( false , t1 . Descriptor , t2 . Descriptor ) ;
66+ Assert . That ( ct . ToString ( ) , Is . EqualTo ( "ConcatTransform(TupleDescriptor(Int32, String) + TupleDescriptor(Int32, Double, String), r/w)" ) ) ;
6067
61- CombineTransform mt3 = new CombineTransform ( false , t1 . Descriptor , t1 . Descriptor , t1 . Descriptor ) ;
62- Xtensive . Tuples . Tuple wt3 = mt3 . Apply ( TupleTransformType . TransformedTuple , t1 , t1 , t1 ) ;
63- TestLog . Info ( $ "Wrapper: { wt3 } ") ;
64- Xtensive . Tuples . Tuple ct3 = mt3 . Apply ( TupleTransformType . Tuple , t1 , t1 , t1 ) ;
65- TestLog . Info ( $ "Copy: { ct3 } ") ;
66- t1 . SetValue ( 0 , 0 ) ;
67- Assert . That ( t1 . GetValue ( 0 ) , Is . EqualTo ( wt3 . GetValue ( 4 ) ) ) ;
68- t1 . SetValue ( 0 , 1 ) ;
69-
70- CombineTransform mt4 = new CombineTransform ( false , t1 . Descriptor , t1 . Descriptor , t1 . Descriptor , t1 . Descriptor ) ;
71- Xtensive . Tuples . Tuple wt4 = mt4 . Apply ( TupleTransformType . TransformedTuple , t1 , t1 , t1 , t1 ) ;
72- TestLog . Info ( $ "Wrapper: { wt4 } ") ;
73- Xtensive . Tuples . Tuple ct4 = mt4 . Apply ( TupleTransformType . Tuple , t1 , t1 , t1 , t1 ) ;
74- TestLog . Info ( $ "Copy: { ct4 } ") ;
75- t1 . SetValue ( 0 , 0 ) ;
76- Assert . That ( t1 . GetValue ( 0 ) , Is . EqualTo ( wt4 . GetValue ( 6 ) ) ) ;
77- t1 . SetValue ( 0 , 1 ) ;
7868 }
7969
8070 [ Test ]
8171 [ Explicit ]
8272 [ Category ( "Performance" ) ]
83- public void PerformanceTest1 ( )
73+ public void ComparisonPerformanceTest ( )
8474 {
8575 AdvancedComparerStruct < Xtensive . Tuples . Tuple > comparer = AdvancedComparerStruct < Xtensive . Tuples . Tuple > . Default ;
8676 Xtensive . Tuples . Tuple t = Xtensive . Tuples . Tuple . Create ( 1 ) ;
87- CombineTransform mt = new CombineTransform ( false , t . Descriptor , t . Descriptor ) ;
77+ ConcatTransform mt = new ConcatTransform ( false , t . Descriptor , t . Descriptor ) ;
8878 Xtensive . Tuples . Tuple wt1 = mt . Apply ( TupleTransformType . TransformedTuple , t , t ) ;
8979 Xtensive . Tuples . Tuple wt2 = mt . Apply ( TupleTransformType . TransformedTuple , t , t ) ;
9080 Xtensive . Tuples . Tuple ct1 = mt . Apply ( TupleTransformType . Tuple , t , t ) ;
@@ -96,55 +86,78 @@ public void PerformanceTest1()
9686 comparer . Equals ( wt1 , wt2 ) ;
9787
9888 TestHelper . CollectGarbage ( ) ;
99- using ( new Measurement ( "O&O" , MeasurementOptions . Log , count ) )
100- for ( int i = 0 ; i < count ; i ++ )
89+ using ( var mx = new Measurement ( "O&O" , MeasurementOptions . Log , count ) ) {
90+ for ( int i = 0 ; i < count ; i ++ )
10191 comparer . Equals ( ct1 , ct2 ) ;
10292
93+ mx . Complete ( ) ;
94+ Console . WriteLine ( mx . ToString ( ) ) ;
95+ }
96+
10397 TestHelper . CollectGarbage ( ) ;
104- using ( new Measurement ( "O&W" , MeasurementOptions . Log , count ) )
105- for ( int i = 0 ; i < count ; i ++ )
98+ using ( var mx = new Measurement ( "O&W" , MeasurementOptions . Log , count ) ) {
99+ for ( int i = 0 ; i < count ; i ++ )
106100 comparer . Equals ( ct1 , wt1 ) ;
101+
102+ mx . Complete ( ) ;
103+ Console . WriteLine ( mx . ToString ( ) ) ;
104+ }
107105
108106 TestHelper . CollectGarbage ( ) ;
109- using ( new Measurement ( "W&W" , MeasurementOptions . Log , count ) )
107+ using ( var mx = new Measurement ( "W&W" , MeasurementOptions . Log , count ) ) {
110108 for ( int i = 0 ; i < count ; i ++ )
111109 comparer . Equals ( wt1 , wt2 ) ;
110+
111+ mx . Complete ( ) ;
112+ Console . WriteLine ( mx . ToString ( ) ) ;
113+ }
112114 }
113115
114116
115117 [ Test ]
116118 [ Explicit ]
117119 [ Category ( "Performance" ) ]
118- public void PerformanceTest2 ( )
120+ public void InstanceCreationPerformanceTest ( )
119121 {
120- AdvancedComparerStruct < Xtensive . Tuples . Tuple > comparer = AdvancedComparerStruct < Xtensive . Tuples . Tuple > . Default ;
121- Xtensive . Tuples . Tuple t = Xtensive . Tuples . Tuple . Create ( 1 ) ;
122- CombineTransform mt = new CombineTransform ( false , t . Descriptor , t . Descriptor , t . Descriptor , t . Descriptor ) ;
123- SegmentTransform st = new SegmentTransform ( false , mt . Descriptor , new Segment < int > ( 1 , 2 ) ) ;
124- Xtensive . Tuples . Tuple wt1 = st . Apply ( TupleTransformType . TransformedTuple , mt . Apply ( TupleTransformType . TransformedTuple , t , t , t , t ) ) ;
125- Xtensive . Tuples . Tuple wt2 = st . Apply ( TupleTransformType . TransformedTuple , mt . Apply ( TupleTransformType . TransformedTuple , t , t , t , t ) ) ;
126- Xtensive . Tuples . Tuple ct1 = st . Apply ( TupleTransformType . Tuple , mt . Apply ( TupleTransformType . Tuple , t , t , t , t ) ) ;
127- Xtensive . Tuples . Tuple ct2 = st . Apply ( TupleTransformType . Tuple , mt . Apply ( TupleTransformType . Tuple , t , t , t , t ) ) ;
128- int count = IterationCount ;
129-
130- comparer . Equals ( ct1 , ct2 ) ;
131- comparer . Equals ( ct1 , wt1 ) ;
132- comparer . Equals ( wt1 , wt2 ) ;
133-
134- TestHelper . CollectGarbage ( ) ;
135- using ( new Measurement ( "O&O" , MeasurementOptions . Log , count ) )
136- for ( int i = 0 ; i < count ; i ++ )
137- comparer . Equals ( ct1 , ct2 ) ;
138-
139- TestHelper . CollectGarbage ( ) ;
140- using ( new Measurement ( "O&W" , MeasurementOptions . Log , count ) )
141- for ( int i = 0 ; i < count ; i ++ )
142- comparer . Equals ( ct1 , wt1 ) ;
143-
144- TestHelper . CollectGarbage ( ) ;
145- using ( new Measurement ( "W&W" , MeasurementOptions . Log , count ) )
146- for ( int i = 0 ; i < count ; i ++ )
147- comparer . Equals ( wt1 , wt2 ) ;
122+ Xtensive . Tuples . Tuple t1 = Xtensive . Tuples . Tuple . Create ( 1 ) ;
123+ Xtensive . Tuples . Tuple t2 = Xtensive . Tuples . Tuple . Create ( 1 , "2" ) ;
124+ Xtensive . Tuples . Tuple t3 = Xtensive . Tuples . Tuple . Create ( 1 , 2L , "3" ) ;
125+ Xtensive . Tuples . Tuple t4 = Xtensive . Tuples . Tuple . Create ( 1 , 2L , "3" , "4" ) ;
126+ Xtensive . Tuples . Tuple t5 = Xtensive . Tuples . Tuple . Create ( 1 , 2L , "3" , "4" , 5 ) ;
127+ Xtensive . Tuples . Tuple t6 = Xtensive . Tuples . Tuple . Create ( 1 , 2L , "3" , "4" , 5 , 6L ) ;
128+
129+ int count = IterationCount * 10 ;
130+
131+ _ = new ConcatTransform ( false , t1 . Descriptor , t1 . Descriptor ) ;
132+ _ = new ConcatTransform ( false , t2 . Descriptor , t2 . Descriptor ) ;
133+ _ = new ConcatTransform ( false , t3 . Descriptor , t3 . Descriptor ) ;
134+ _ = new ConcatTransform ( false , t4 . Descriptor , t4 . Descriptor ) ;
135+ _ = new ConcatTransform ( false , t5 . Descriptor , t5 . Descriptor ) ;
136+
137+ for ( var run = 0 ; run < MeasurementRuns ; run ++ ) {
138+ TestHelper . CollectGarbage ( ) ;
139+ using ( var mx = new Measurement ( "N1Concat" , MeasurementOptions . Log , count ) ) {
140+ for ( int i = 0 ; i < count ; i ++ ) {
141+ _ = new ConcatTransform ( false , t1 . Descriptor , t1 . Descriptor ) ;
142+ }
143+
144+ mx . Complete ( ) ;
145+ Console . WriteLine ( mx . ToString ( ) ) ;
146+ }
147+ }
148+
149+ Console . WriteLine ( ) ;
150+ for ( var run = 0 ; run < MeasurementRuns ; run ++ ) {
151+ TestHelper . CollectGarbage ( ) ;
152+ using ( var mx = new Measurement ( "N5Concat" , MeasurementOptions . Log , count ) ) {
153+ for ( int i = 0 ; i < count ; i ++ ) {
154+ _ = new ConcatTransform ( false , t5 . Descriptor , t5 . Descriptor ) ;
155+ }
156+
157+ mx . Complete ( ) ;
158+ Console . WriteLine ( mx . ToString ( ) ) ;
159+ }
160+ }
148161 }
149162 }
150163}
0 commit comments