Информация об изменениях

Сообщение Re[3]: Define TRACE constant от 16.01.2017 13:14

Изменено 16.01.2017 13:34 Sinix

Re[3]: Define TRACE constant
Здравствуйте, Somescout, Вы писали:

S>Архив проекта. Я в попытках понять что не так насоздавал множество конфигфигураций, trace выключен в x64 и включён во всех остальных.

S>Visual Studio 2015 Community Ed. Update 3

Мерять надо правильно
  Скрытый текст
    class Program
    {
        static void Main(string[] args)
        {
            Console.WindowWidth = 120;

            Measure("FibObj", () => new FibObj(40).Value);
            Measure("FibStr", () => new FibStr(40).Value);

            Console.ReadKey();
        }


        static void Measure(string name, Func<long> callback)
        {
            GC.Collect();
            GC.WaitForPendingFinalizers();
            GC.Collect();

            var mem = GC.GetTotalMemory(true);
            var gc00 = GC.CollectionCount(0);
            var gc01 = GC.CollectionCount(1);
            var gc02 = GC.CollectionCount(2);

            var sw = Stopwatch.StartNew();
            var result = callback();
            sw.Stop();

            var mem2 = GC.GetTotalMemory(false);
            var gc10 = GC.CollectionCount(0);
            var gc11 = GC.CollectionCount(1);
            var gc12 = GC.CollectionCount(2);

            var memDelta = (mem2 - mem) / 1024.0;
            var gcDelta0 = gc10 - gc00;
            var gcDelta1 = gc11 - gc01;
            var gcDelta2 = gc12 - gc02;

            Console.WriteLine(
                "{0,15}: {1,5}ms, ips: {2,22:N} | Mem: {3,9:N2} kb, GC 0/1/2: {4,4}/{5:3}/{6:2} => {7,6}",
                name, sw.ElapsedMilliseconds, result / sw.Elapsed.TotalSeconds, memDelta, gcDelta0, gcDelta1, gcDelta2, result);
        }
    }


         FibObj:  1318ms, ips:          77 586 051,21 | Mem:  1 688,17 kb, GC 0/1/2: 1561/3/2 => 102334155
         FibStr:   477ms, ips:         214 305 499,74 | Mem:      8,00 kb, GC 0/1/2:    0/3/2 => 102334155


Что с TRACE, что с без. Запускать, разумеется, release-версию AnyCpu по Сtrl-F5, без отладчика.

Если хочется проверить на RyuJit — дополнительно снимаем галочку "prefer 32 bit" в свойствах проекта, вкладка Build.
Re[3]: Define TRACE constant
Здравствуйте, Somescout, Вы писали:

S>Архив проекта. Я в попытках понять что не так насоздавал множество конфигфигураций, trace выключен в x64 и включён во всех остальных.

S>Visual Studio 2015 Community Ed. Update 3

Мерять надо правильно
  Скрытый текст
    class Program
    {
        // Fast doubling algorithm
        // https://www.nayuki.io/res/fast-fibonacci-algorithms/fastfibonacci.cs
        private static long FibonacciNayuki(int n)
        {
            long a = 0;
            long b = 1;
            for (int i = 31; i >= 0; i--)
            {
                long d = a * (b * 2 - a);
                long e = a * a + b * b;
                a = d;
                b = e;
                if ((((uint)n >> i) & 1) != 0)
                {
                    long c = a + b;
                    a = b;
                    b = c;
                }
            }
            return a;
        }

        static void Main(string[] args)
        {
            Console.WindowWidth = 120;

            Measure("FibNayuki",  () => FibonacciNayuki(40));
            Measure("FibObj", () => new FibObj(40).Value);
            Measure("FibStr", () => new FibStr(40).Value);

            Console.ReadKey();
        }


        static void Measure(string name, Func<long> callback)
        {
            GC.Collect();
            GC.WaitForPendingFinalizers();
            GC.Collect();

            var mem = GC.GetTotalMemory(true);
            var gc00 = GC.CollectionCount(0);
            var gc01 = GC.CollectionCount(1);
            var gc02 = GC.CollectionCount(2);

            var sw = Stopwatch.StartNew();
            var result = callback();
            sw.Stop();

            var mem2 = GC.GetTotalMemory(false);
            var gc10 = GC.CollectionCount(0);
            var gc11 = GC.CollectionCount(1);
            var gc12 = GC.CollectionCount(2);

            var memDelta = (mem2 - mem) / 1024.0;
            var gcDelta0 = gc10 - gc00;
            var gcDelta1 = gc11 - gc01;
            var gcDelta2 = gc12 - gc02;

            Console.WriteLine(
                "{0,15}: {1,5}ms, ips: {2,22:N} | Mem: {3,9:N2} kb, GC 0/1/2: {4,4}/{5}/{6} => {7,6}",
                name, sw.ElapsedMilliseconds, result / sw.Elapsed.TotalSeconds, memDelta, gcDelta0, gcDelta1, gcDelta2, result);
        }
    }

      FibNayuki:     0ms, ips:     374 713 127 059,69 | Mem:      8,00 kb, GC 0/1/2:    0/0/0 => 102334155
         FibObj:  1501ms, ips:          68 167 404,43 | Mem:  1 688,17 kb, GC 0/1/2: 1561/0/0 => 102334155
         FibStr:   477ms, ips:         214 160 637,60 | Mem:      8,00 kb, GC 0/1/2:    0/0/0 => 102334155


Что с TRACE, что с без. Запускать, разумеется, release-версию AnyCpu по Сtrl-F5, без отладчика.

Если хочется проверить на RyuJit — дополнительно снимаем галочку "prefer 32 bit" в свойствах проекта, вкладка Build.