Esempio n. 1
0
            public void ExecuteSleepLock(object argument)
            {
                using (IndentManager.IncreaseIndent()) {
                    bool   log       = !warmup && (int)argument == 0;
                    int    passCount = PassCount;
                    Thread thread    = Thread.CurrentThread;
                    using (new Measurement("Sleep lock  ", log ? MeasurementOptions.Log : 0, passCount))
                        for (int j = 0; j < passCount; j++)
                        {
Wait:
                            while (LastAccessor == thread)
                            {
                                if (Stop)
                                {
                                    return;
                                }
                            }
                            lock (ObjectLock) {
                                if (LastAccessor == thread)
                                {
                                    goto Wait;
                                }
                                LastAccessor = thread;
                            }
                            Thread.Sleep(0);
                        }
                }
            }
        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();
            }
        }
Esempio n. 3
0
 public void ExecuteWriteLock(object argument)
 {
     using (IndentManager.IncreaseIndent()) {
         bool   log         = !warmup && (int)argument == 0;
         int    lockCount   = 0;
         int    switchCount = 0;
         int    passCount   = PassCount;
         Thread thread      = Thread.CurrentThread;
         using (new Measurement("Write lock  ", log ? MeasurementOptions.Log : 0, passCount))
             for (int j = 0; j < passCount; j++)
             {
                 SlimLock.EnterWriteLock();
                 try {
                     lockCount++;
                     if (LastAccessor != thread)
                     {
                         LastAccessor = thread;
                         switchCount++;
                     }
                 }
                 finally {
                     SlimLock.ExitWriteLock();
                 }
             }
         if (log)
         {
             TestLog.Info("  Switch rate: {0} ({1:F3}%)", switchCount, switchCount * 1.0 / lockCount);
         }
     }
 }
Esempio n. 4
0
        private void GMethod2CallTest <T, T1, T2>(double speedFactor)
        {
            Random        r = RandomManager.CreateRandom(SeedVariatorType.CallingMethod);
            T             o = InstanceGeneratorProvider.Default.GetInstanceGenerator <T>().GetInstance(r);
            Container <T> c = new Container <T>(o);
            Action        a = c.Method2 <T1, T2>;
            // Warmup
            int iterations = 100;

            CallClassGMethod2 <T, T1, T2>(c, iterations);
            a.Invoke();
            CastClassGMethod2 <T, T1, T2>(c, iterations);
            // Real test
            iterations = (int)(IterationCount * speedFactor);
            TestLog.Info("Regular call test (2 generic arguments: {0}, {1}):", typeof(T1).GetShortName(), typeof(T2).GetShortName());
            TestLog.Info("  Type: {0}", typeof(T).GetShortName());
            FastCache <T> .Value = null;
            using (IndentManager.IncreaseIndent()) {
                Cleanup();
                using (new Measurement("Method 2              ", MeasurementOptions.Log, iterations))
                    CallClassGMethod2 <T, T1, T2>(c, iterations);
                // Cleanup();
                using (new Measurement("Method 2 (by delegate)", MeasurementOptions.Log, iterations))
                    CallAction(a, iterations);
                // Cleanup();
                using (new Measurement("Method 2 cast         ", MeasurementOptions.Log, iterations))
                    CastClassGMethod2 <T, T1, T2>(c, iterations);
                Cleanup();
            }
        }
 public void InnerTest <T>(double speedFactor)
 {
     TestLog.Info("Type {0}:", typeof(T).GetShortName());
     using (IndentManager.IncreaseIndent()) {
         TwoValuesTest <T>((int)(TwoValueTestIterations * speedFactor));
         ArrayTest <T>((int)(ArrayTestShortLength * speedFactor), ArrayTestShortIterations, 0);
         ArrayTest <T>((int)(ArrayTestShortLength * speedFactor), ArrayTestShortIterations, 0.5);
         ArrayTest <T>((int)(ArrayTestShortLength * speedFactor), ArrayTestShortIterations, 1);
         ArrayTest <T>((int)(ArrayTestLongLength * speedFactor), ArrayTestLongIterations, 0);
         ArrayTest <T>((int)(ArrayTestLongLength * speedFactor), ArrayTestLongIterations, 0.5);
         ArrayTest <T>((int)(ArrayTestLongLength * speedFactor), ArrayTestLongIterations, 1);
     }
 }
Esempio n. 6
0
        private void VMethodCallTest <T>(double speedFactor)
        {
            Random            r  = RandomManager.CreateRandom(SeedVariatorType.CallingMethod);
            T                 o  = InstanceGeneratorProvider.Default.GetInstanceGenerator <T>().GetInstance(r);
            ContainerBase <T> c  = new Container <T>(o);
            IContainer <T>    ic = (IContainer <T>)c;
            // Warmup
            int iterations = 100;

            FastCache <T> .Value = null;
            CallClassVMethod(c, iterations);
            CallClassVMethod_WithBoxing(c, iterations);
            CallInterfaceVMethod(ic, iterations);
            CallInterfaceVMethod_WithoutCaching(ic, iterations);
            CallInterfaceVMethod_WithCast(c, iterations);
            // Real test
            iterations = (int)(IterationCount * speedFactor);
            TestLog.Info("Virtual call test:");
            TestLog.Info("  Type: {0}", typeof(T).GetShortName());
            FastCache <T> .Value = null;
            using (IndentManager.IncreaseIndent()) {
                Cleanup();
                using (new Measurement("Virtual method (typed)          ", MeasurementOptions.Log, iterations))
                    CallClassVMethod(c, iterations);
                // Cleanup();
                using (new Measurement("Virtual method (with boxing)    ", MeasurementOptions.Log, iterations))
                    CallClassVMethod_WithBoxing(c, iterations);
                Cleanup();
                using (new Measurement("Virtual method cast             ", MeasurementOptions.Log, iterations))
                    CastClassVMethod(c, iterations);
                Cleanup();
                using (new Measurement("Interface method                ", MeasurementOptions.Log, iterations))
                    CallInterfaceVMethod(ic, iterations);
                Cleanup();
                using (new Measurement("Interface method (worst case)   ", MeasurementOptions.Log, iterations))
                    CallInterfaceVMethod_WithoutCaching(ic, iterations);
                Cleanup();
                using (new Measurement("Interface method (with cast)    ", MeasurementOptions.Log, iterations))
                    CallInterfaceVMethod_WithCast(c, iterations);
                Cleanup();
                using (new Measurement("Interface method cast           ", MeasurementOptions.Log, iterations))
                    CastInterfaceVMethod(ic, iterations);
                Cleanup();
            }
        }
Esempio n. 7
0
            public void ExecuteInvokeAsync(object argument)
            {
                Action d = delegate {
                    return;
                };

                using (IndentManager.IncreaseIndent()) {
                    bool   log       = !warmup && (int)argument == 0;
                    int    passCount = PassCount;
                    Thread thread    = Thread.CurrentThread;
                    using (new Measurement("Execute", log ? MeasurementOptions.Log : 0, passCount))
                        for (int j = 0; j < passCount; j++)
                        {
                            IAsyncResult r = d.BeginInvoke(null, null);
                            d.EndInvoke(r);
                        }
                }
            }
Esempio n. 8
0
        private void GVMethod2CallTest <T, T1, T2>(double speedFactor)
        {
            Random            r  = RandomManager.CreateRandom(SeedVariatorType.CallingMethod);
            T                 o  = InstanceGeneratorProvider.Default.GetInstanceGenerator <T>().GetInstance(r);
            ContainerBase <T> c  = new Container <T>(o);
            IContainer <T>    ic = (IContainer <T>)c;
            Action            a1 = c.GenericMethod2 <T1, T2>;
            Action            a2 = ic.GenericMethod2 <T1, T2>;
            // Warmup
            int iterations = 100;

            CallClassGVMethod2 <T, T1, T2>(c, iterations);
            CallInterfaceGVMethod2 <T, T1, T2>(ic, iterations);
            a1.Invoke();
            a2.Invoke();
            CastClassGVMethod2 <T, T1, T2>(c, iterations);
            CastInterfaceGVMethod2 <T, T1, T2>(ic, iterations);
            // Real test
            iterations = (int)(IterationCount * speedFactor);
            TestLog.Info("Virtual generic call test (2 generic arguments: {0}, {1}):", typeof(T1).GetShortName(), typeof(T2).GetShortName());
            TestLog.Info("  Type: {0}", typeof(T).GetShortName());
            FastCache <T> .Value = null;
            using (IndentManager.IncreaseIndent()) {
                Cleanup();
                using (new Measurement("Generic method 2 (class)                 ", MeasurementOptions.Log, iterations))
                    CallClassGVMethod2 <T, T1, T2>(c, iterations);
                // Cleanup();
                using (new Measurement("Generic method 2 (class, by delegate)    ", MeasurementOptions.Log, iterations))
                    CallAction(a1, iterations);
                // Cleanup();
                using (new Measurement("Generic method 2 cast (class)            ", MeasurementOptions.Log, iterations))
                    CastClassGVMethod2 <T, T1, T2>(c, iterations);
                Cleanup();
                using (new Measurement("Generic method 2 (interface)             ", MeasurementOptions.Log, iterations))
                    CallInterfaceGVMethod2 <T, T1, T2>(ic, iterations);
                // Cleanup();
                using (new Measurement("Generic method 2 (interface, by delegate)", MeasurementOptions.Log, iterations))
                    CallAction(a2, iterations);
                // Cleanup();
                using (new Measurement("Generic method 2 cast (interface)        ", MeasurementOptions.Log, iterations))
                    CastInterfaceGVMethod2 <T, T1, T2>(ic, iterations);
                Cleanup();
            }
        }
 public void TestSequence <T>(int size, double expectedShare, double shareTolerance)
 {
     TestLog.Info("{0} random sequence, {1} items:", typeof(T).GetShortName(), size);
     using (IndentManager.IncreaseIndent()) {
         TestLog.Info("Expected probability: {0}, tolerance: {1}.", expectedShare, shareTolerance);
         // Testing the same sequence
         Random r1 = RandomManager.CreateRandom(SeedVariatorType.CallingMethod);
         Random r2 = RandomManager.CreateRandom(SeedVariatorType.CallingMethod);
         double equalityProbability = GetEqualityProbability <T>(r1, r2, size);
         Assert.AreEqual(1, equalityProbability);
         // Testing different sequences
         r1 = RandomManager.CreateRandom(1, SeedVariatorType.CallingMethod);
         r2 = RandomManager.CreateRandom(2, SeedVariatorType.CallingMethod);
         using (new Measurement("Generation and comparison", size * 2))
             equalityProbability = GetEqualityProbability <T>(r1, r2, size);
         TestLog.Info("Actual probability:   {0}.", equalityProbability);
         Assert.AreEqual(expectedShare, equalityProbability, shareTolerance);
     }
 }
        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();
            }
        }
Esempio n. 11
0
        private void RunNullCheckTest(double speedFactor)
        {
            int count = (int)(IterationCount * speedFactor);

            // Warmup
            Holder[] holders = new Holder[10];
            FillHolders(holders);
            NoCheckLoop(holders);
            NullCheckLoop(holders);
            // Real test
            holders = new Holder[count];
            FillHolders(holders);
            TestLog.Info("Null check test:");
            using (IndentManager.IncreaseIndent()) {
                TestHelper.CollectGarbage();
                using (new Measurement("No check  ", MeasurementOptions.Log, count))
                    NoCheckLoop(holders);
                TestHelper.CollectGarbage();
                using (new Measurement("Null check  ", MeasurementOptions.Log, count))
                    NullCheckLoop(holders);
                TestHelper.CollectGarbage();
            }
        }
        private void TestTypes(Type[] types)
        {
            TupleDescriptor descriptor = TupleDescriptor.Create(types);

            TestLog.Info("Testing sequence {0}:", descriptor);
            using (IndentManager.IncreaseIndent()) {
                // Logic test
                LogicTest(types, this, GetType(), "SequenceAStep");
                LogicTest(types, null, GetType(), "SequenceAStaticStep");

                // Performance tests
                ExecutionData data = ExecutionData.Create();
                ExecutionSequenceHandler <ExecutionData>[] delegates;

                int count = passCount / 1000;
                delegates = DelegateHelper.CreateDelegates <ExecutionSequenceHandler <ExecutionData> >(
                    this, GetType(), "SequenceBStep", types);
                TestHelper.CollectGarbage();
                using (new Measurement("Creating delegates", count))
                    for (int i = 0; i < count; i++)
                    {
                        delegates = DelegateHelper.CreateDelegates <ExecutionSequenceHandler <ExecutionData> >(
                            this, GetType(), "SequenceBStep", types);
                    }

                count = passCount;
                DelegateHelper.ExecuteDelegates(delegates, ref data, Direction.Positive);
                data = ExecutionData.Create();
                TestHelper.CollectGarbage();
                using (new Measurement("Executing delegates", count))
                    for (int i = 0; i < count; i++)
                    {
                        DelegateHelper.ExecuteDelegates(delegates, ref data, Direction.Positive);
                    }
                Assert.AreEqual(count * types.Length, data.CallCount);
            }
        }
Esempio n. 13
0
        private void RunTryCatchTest(double speedFactor)
        {
            int count = (int)(IterationCount * speedFactor);
            // Warmup
            Holder h = new Holder();

            NoTryNoExceptionLoop(h, 10);
            TryNoExceptionLoop(h, 10);
            TryCatchExceptionLoop(h, 10);
            // Real test
            TestLog.Info("Try-catch test:");
            using (IndentManager.IncreaseIndent()) {
                TestHelper.CollectGarbage();
                using (new Measurement("NoTryNoException ", MeasurementOptions.Log, count))
                    NoTryNoExceptionLoop(h, count);
                TestHelper.CollectGarbage();
                using (new Measurement("TryNoException   ", MeasurementOptions.Log, count))
                    TryNoExceptionLoop(h, count);
                TestHelper.CollectGarbage();
                using (new Measurement("TryCatchException", MeasurementOptions.Log, count))
                    TryCatchExceptionLoop(h, count);
                TestHelper.CollectGarbage();
            }
        }
Esempio n. 14
0
        private void CloneTest <T>(double speedFactor)
        {
            Random        r = RandomManager.CreateRandom(SeedVariatorType.CallingMethod);
            T             o = InstanceGeneratorProvider.Default.GetInstanceGenerator <T>().GetInstance(r);
            Cloneable <T> c = new Cloneable <T>(o);

            // Warmup
            Cloneable <T>[] a = new Cloneable <T> [100];
            CloneByMCLoop(c, a);
            CloneByCLoop(c, a);
            // Real test
            a = new Cloneable <T> [(int)(CloneTestArrayLength * speedFactor / 10 * 10)];
            TestLog.Info("Cloning test:");
            TestLog.Info("  Type: {0}, length: {1}", c.GetType().GetShortName(), a.Length);
            using (IndentManager.IncreaseIndent()) {
                Cleanup();
                using (new Measurement("MemberwiseClone   ", MeasurementOptions.Log, a.Length))
                    CloneByMCLoop(c, a);
                Cleanup();
                using (new Measurement("CopyingConstructor", MeasurementOptions.Log, a.Length))
                    CloneByCLoop(c, a);
                Cleanup();
            }
        }
Esempio n. 15
0
        private void AccessFieldTest <T>(double speedFactor)
        {
            int           count = (int)(IterationCount * speedFactor);
            Random        r     = RandomManager.CreateRandom(SeedVariatorType.CallingMethod);
            T             o     = InstanceGeneratorProvider.Default.GetInstanceGenerator <T>().GetInstance(r);
            Container <T> c     = new Container <T>(o);

            if (!warmup)
            {
                TestLog.Info("Type: {0}, length: {1}", o.GetType().GetShortName(), count);
            }
            using (IndentManager.IncreaseIndent()) {
                if (!warmup)
                {
                    TestLog.Info("Direct field access test:");
                }
                using (IndentManager.IncreaseIndent()) {
                    TestHelper.CollectGarbage();
                    using (new Measurement("Read  ", warmup ? 0 : MeasurementOptions.Log, count))
                        for (int i = 0; i < count; i++)
                        {
                            o = c.Value;
                        }
                    TestHelper.CollectGarbage();
                    using (new Measurement("Write ", warmup ? 0 : MeasurementOptions.Log, count))
                        for (int i = 0; i < count; i++)
                        {
                            c.Value = o;
                        }
                    TestHelper.CollectGarbage();
                }

                if (!warmup)
                {
                    TestLog.Info("TypedReference field access test:");
                }
                using (IndentManager.IncreaseIndent()) {
                    var            fi = c.GetType().GetField("Value");
                    TypedReference tr = __makeref(c);
                    TestHelper.CollectGarbage();
                    using (new Measurement("GetRef", warmup ? 0 : MeasurementOptions.Log, count))
                        for (int i = 0; i < count; i++)
                        {
                            tr = __makeref(c);
                        }
                    TestHelper.CollectGarbage();
                    using (new Measurement("Read  ", warmup ? 0 : MeasurementOptions.Log, count))
                        for (int i = 0; i < count; i++)
                        {
                            o = (T)fi.GetValueDirect(tr);
                        }
                    TestHelper.CollectGarbage();
                    using (new Measurement("Write ", warmup ? 0 : MeasurementOptions.Log, count))
                        for (int i = 0; i < count; i++)
                        {
                            fi.SetValueDirect(tr, o);
                        }
                    TestHelper.CollectGarbage();
                }
            }
        }