public void ArrayTest <T>(int length, int count, double equalityProbability)
        {
            Random r = RandomManager.CreateRandom(SeedVariatorType.CallingMethod);
            IInstanceGenerator <T> g        = InstanceGeneratorProvider.Default.GetInstanceGenerator <T>();
            IEnumerator <T>        sequence = InstanceGenerationUtils <T> .GetInstances(g, r, equalityProbability).GetEnumerator();

            sequence.MoveNext();
            T[] array = new T[length];
            for (int i = 0; i < length; i++, sequence.MoveNext())
            {
                array[i] = sequence.Current;
            }
            AdvancedComparerStruct <T> c1 = AdvancedComparer <T> .System;
            AdvancedComparerStruct <T> c2 = AdvancedComparer <T> .Default;

            if (!TestInfo.IsProfileTestRunning)
            {
                ArrayComparisonLoop(c1, array, 1);
            }
            ArrayComparisonLoop(c2, array, 1);
            TestLog.Info("Array comparison (equality probability = {0}):", (int)(equalityProbability * 100));
            TestLog.Info("  Type: {0}, array length: {1}", typeof(T).GetShortName(), length);
            using (IndentManager.IncreaseIndent()) {
                TestHelper.CollectGarbage();
                if (!TestInfo.IsProfileTestRunning)
                {
                    using (new Measurement("Default  comparer", MeasurementOptions.Log, (length - 1) * count))
                        ArrayComparisonLoop(c1, array, count);
                    TestHelper.CollectGarbage();
                }
                using (new Measurement("Xtensive comparer", MeasurementOptions.Log, (length - 1) * count))
                    ArrayComparisonLoop(c2, array, count);
                TestHelper.CollectGarbage();
            }
        }
 private static void SimpleComparisonLoop <T>(AdvancedComparerStruct <T> c, T o1, T o2, int count)
 {
     for (int i = 0; i < count; i++)
     {
         c.Equals(o1, o2);
     }
 }
        public void PerformanceTransformTesting(Xtensive.Tuples.Tuple tuple1, Xtensive.Tuples.Tuple tuple2, Xtensive.Tuples.Tuple tuple3, Xtensive.Tuples.Tuple tuple4)
        {
            int count = IterationCount;

            AdvancedComparerStruct <Xtensive.Tuples.Tuple> comparer = AdvancedComparerStruct <Xtensive.Tuples.Tuple> .Default;

            comparer.Equals(tuple1, tuple2);
            comparer.Equals(tuple1, tuple3);
            comparer.Equals(tuple3, tuple4);

            TestHelper.CollectGarbage();
            using (new Measurement("O&O", MeasurementOptions.Log, count))
                for (int i = 0; i < count; i++)
                {
                    comparer.Equals(tuple1, tuple2);
                }

            TestHelper.CollectGarbage();
            using (new Measurement("O&W", MeasurementOptions.Log, count))
                for (int i = 0; i < count; i++)
                {
                    comparer.Equals(tuple1, tuple3);
                }

            TestHelper.CollectGarbage();
            using (new Measurement("W&W", MeasurementOptions.Log, count))
                for (int i = 0; i < count; i++)
                {
                    comparer.Equals(tuple3, tuple4);
                }
        }
        public void PerformanceTest()
        {
            AdvancedComparerStruct <Xtensive.Tuples.Tuple> comparer = AdvancedComparerStruct <Xtensive.Tuples.Tuple> .Default;

            Xtensive.Tuples.Tuple t   = Xtensive.Tuples.Tuple.Create(1, 2);
            Xtensive.Tuples.Tuple ct  = t.ToRegular();
            Xtensive.Tuples.Tuple wt  = t.ToReadOnly(TupleTransformType.TransformedTuple);
            Xtensive.Tuples.Tuple wtc = t.ToReadOnly(TupleTransformType.TransformedTuple);
            int count = IterationCount;

            comparer.Equals(t, ct);
            comparer.Equals(t, wt);
            comparer.Equals(wt, wtc);

            TestHelper.CollectGarbage();
            using (new Measurement("O&O", MeasurementOptions.Log, count))
                for (int i = 0; i < count; i++)
                {
                    comparer.Equals(t, ct);
                }

            TestHelper.CollectGarbage();
            using (new Measurement("O&W", MeasurementOptions.Log, count))
                for (int i = 0; i < count; i++)
                {
                    comparer.Equals(t, wt);
                }

            TestHelper.CollectGarbage();
            using (new Measurement("W&W", MeasurementOptions.Log, count))
                for (int i = 0; i < count; i++)
                {
                    comparer.Equals(wt, wtc);
                }
        }
        private static void ArrayComparisonLoop <T>(AdvancedComparerStruct <T> c, T[] array, int count)
        {
            int length = array.Length;

            for (int j = 0; j < count; j++)
            {
                for (int i = 0; i < length - 1;)
                {
                    c.Equals(array[i], array[++i]);
                }
            }
        }
        public void TwoValuesTest <T>(int count)
        {
            Random r = RandomManager.CreateRandom(SeedVariatorType.CallingMethod);
            IInstanceGenerator <T> g        = InstanceGeneratorProvider.Default.GetInstanceGenerator <T>();
            IEnumerator <T>        sequence = InstanceGenerationUtils <T> .GetInstances(g, r, 1).GetEnumerator();

            sequence.MoveNext();
            T o1 = sequence.Current;

            sequence.MoveNext();
            T o1c = sequence.Current;
            T o2  = g.GetInstance(r);
            AdvancedComparerStruct <T> c1 = AdvancedComparer <T> .System;
            AdvancedComparerStruct <T> c2 = AdvancedComparer <T> .Default;

            if (!TestInfo.IsProfileTestRunning)
            {
                SimpleComparisonLoop(c1, o1, o2, 1000);
            }
            SimpleComparisonLoop(c2, o1, o2, 1000);
            TestLog.Info("Values comparison:");
            TestLog.Info("  Type: {0}, instances: {1} x 2, {2}", typeof(T).GetShortName(), o1, o2);
            using (IndentManager.IncreaseIndent()) {
                TestHelper.CollectGarbage();
                if (!TestInfo.IsProfileTestRunning)
                {
                    using (new Measurement("Default  comparer (equal)    ", MeasurementOptions.Log, count))
                        SimpleComparisonLoop(c1, o1, o1c, count);
                    TestHelper.CollectGarbage();
                    using (new Measurement("Default  comparer (different)", MeasurementOptions.Log, count))
                        SimpleComparisonLoop(c1, o1, o2, count);
                    TestHelper.CollectGarbage();
                }
                using (new Measurement("Xtensive comparer (equal)    ", MeasurementOptions.Log, count))
                    SimpleComparisonLoop(c2, o1, o1c, count);
                using (new Measurement("Xtensive comparer (different)", MeasurementOptions.Log, count))
                    SimpleComparisonLoop(c2, o1, o2, count);
                TestHelper.CollectGarbage();
            }
        }
        public void PerformanceTest2()
        {
            AdvancedComparerStruct <Xtensive.Tuples.Tuple> comparer = AdvancedComparerStruct <Xtensive.Tuples.Tuple> .Default;

            Xtensive.Tuples.Tuple t  = Xtensive.Tuples.Tuple.Create(1);
            CombineTransform      mt = new CombineTransform(false, t.Descriptor, t.Descriptor, t.Descriptor, t.Descriptor);
            SegmentTransform      st = new SegmentTransform(false, mt.Descriptor, new Segment <int>(1, 2));

            Xtensive.Tuples.Tuple wt1 = st.Apply(TupleTransformType.TransformedTuple, mt.Apply(TupleTransformType.TransformedTuple, t, t, t, t));
            Xtensive.Tuples.Tuple wt2 = st.Apply(TupleTransformType.TransformedTuple, mt.Apply(TupleTransformType.TransformedTuple, t, t, t, t));
            Xtensive.Tuples.Tuple ct1 = st.Apply(TupleTransformType.Tuple, mt.Apply(TupleTransformType.Tuple, t, t, t, t));
            Xtensive.Tuples.Tuple ct2 = st.Apply(TupleTransformType.Tuple, mt.Apply(TupleTransformType.Tuple, t, t, t, t));
            int count = IterationCount;

            comparer.Equals(ct1, ct2);
            comparer.Equals(ct1, wt1);
            comparer.Equals(wt1, wt2);

            TestHelper.CollectGarbage();
            using (new Measurement("O&O", MeasurementOptions.Log, count))
                for (int i = 0; i < count; i++)
                {
                    comparer.Equals(ct1, ct2);
                }

            TestHelper.CollectGarbage();
            using (new Measurement("O&W", MeasurementOptions.Log, count))
                for (int i = 0; i < count; i++)
                {
                    comparer.Equals(ct1, wt1);
                }

            TestHelper.CollectGarbage();
            using (new Measurement("W&W", MeasurementOptions.Log, count))
                for (int i = 0; i < count; i++)
                {
                    comparer.Equals(wt1, wt2);
                }
        }
 public void ClassTest()
 {
     AdvancedComparerStruct <TestClass> dd = AdvancedComparerStruct <TestClass> .System;
 }