Define TRACE constant
От: Somescout  
Дата: 15.01.17 20:07
Оценка: -1
Здравствуйте.

Я возможно чего-то не понимаю, но при включении этой опции в настройках проекта скорость падает в >3 раза. Почему она по умолчанию включена для Release-билда? Почему в среде студии программа выполняется будто она выключена (то есть — если запустить Release build в студии в режиме отладки, он выполнится быстро, тот же билд запущеный извне — медленно, тот же билд с выключенным TRACE извне — быстро...)?

Причём разница в скорости проявляется в тестовой программе, которая мучает исключительно память и процессор, не вызывая непосредственно framework.
ARI ARI ARI... Arrivederci!
Re: Define TRACE constant
От: Sinix  
Дата: 15.01.17 20:16
Оценка:
Здравствуйте, Somescout, Вы писали:

S>Я возможно чего-то не понимаю, но при включении этой опции в настройках проекта скорость падает в >3 раза.


Что-то в лог пишет, очевидно. Проверяй, что за listeners в appconfig подключены.

Я бы снял в профайлере снапшоты для варианта с и без TRACE constant и сравнил. Ну, или давай код, который воспроизводит проблему. Без него долго гадать можно
Re[2]: Define TRACE constant
От: Somescout  
Дата: 16.01.17 03:02
Оценка: 25 (1)
Здравствуйте, Sinix, Вы писали:

S>Что-то в лог пишет, очевидно. Проверяй, что за listeners в appconfig подключены.


Так дефолтный проект, в appconfig только запись о версии фреймворка.

S>Я бы снял в профайлере снапшоты для варианта с и без TRACE constant и сравнил. Ну, или давай код, который воспроизводит проблему. Без него долго гадать можно


Сегодня вечером скину. Там чисто синтетический тест на выделение памяти.
ARI ARI ARI... Arrivederci!
Re[2]: Define TRACE constant
От: Somescout  
Дата: 16.01.17 11:49
Оценка:
Архив проекта. Я в попытках понять что не так насоздавал множество конфигфигураций, trace выключен в x64 и включён во всех остальных.

Visual Studio 2015 Community Ed. Update 3

https://1drv.ms/u/s!Ak3_bhd9xM5JhYRFOFJ7SLz3yLgEMg
ARI ARI ARI... Arrivederci!
Re[3]: Define TRACE constant
От: Sinix  
Дата: 16.01.17 13:14
Оценка:
Здравствуйте, 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.
Отредактировано 16.01.2017 13:34 Sinix . Предыдущая версия .
Re[4]: Define TRACE constant
От: Somescout  
Дата: 16.01.17 13:41
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Мерять надо правильно

  ---
Попробовал мерять вашим методом:

Релизная версия в режиме отладки в студии (Работает быстрее. Почему?!):
         FibStr:   505ms, ips:         202,369,593.78 | Mem:      8.00 kb, GC 0/1/2:    0/3/2 => 102334155
         FibObj:  1470ms, ips:          69,610,075.60 | Mem:  1,688.13 kb, GC 0/1/2: 1561/3/2 => 102334155


Обычный запуск:
         FibStr:   760ms, ips:         134,485,600.65 | Mem:      8.00 kb, GC 0/1/2:    0/3/2 => 102334155
         FibObj:  2662ms, ips:          38,430,185.95 | Mem:  1,688.17 kb, GC 0/1/2: 1561/3/2 => 102334155


Разница хоть и стала меньше, но всё равно стабильно присутствует. И да, похоже TRACE на это не влияет.

PS — IPS, в данном случае ведь не instructions per second?


PS2. Допускаю что проблема в системе, но непонятно какая.

UPD. Действительно, на другом компьютере не воспроизводится. Буду разбираться кто гадит.
UPD2. Закрыл браузер, скорости выровнялись. Странно почему в студии быстрее работало — может она для себя и дочерних процессов affinity выставляет? Как браузер снова потолстеет, попробую разобраться.
ARI ARI ARI... Arrivederci!
Отредактировано 16.01.2017 13:56 Somescout . Предыдущая версия . Еще …
Отредактировано 16.01.2017 13:47 Somescout . Предыдущая версия .
Отредактировано 16.01.2017 13:47 Somescout . Предыдущая версия .
Re[5]: Define TRACE constant
От: Sinix  
Дата: 16.01.17 13:55
Оценка:
Здравствуйте, Somescout, Вы писали:

S>Разница хоть и стала меньше, но всё равно стабильно присутствует. И да, похоже TRACE на это не влияет.

Ага, т.е. релизный код в режиме отладки работает быстрее, чем запущенный по ctrl-F5?
Запускается точно не отладочная версия?

Сколько ни сталкивался с похожим — причина всегда была в "запущено не то и не так". В порядке бреда — временно отключить антивирус и убедиться перед запуском, что система не загружена ничем другим и есть свободная память.
Как тут: http://stackoverflow.com/questions/11984411/application-runs-faster-with-visual-studio-performance-analysis


S>PS — IPS, в данном случае ведь не instructions per second?

Просто попугаи. Если result — число итераций, то тогда да, items per second.
Re[6]: Define TRACE constant
От: Somescout  
Дата: 16.01.17 14:09
Оценка: 25 (1)
Здравствуйте, Sinix, Вы писали:

S>Сколько ни сталкивался с похожим — причина всегда была в "запущено не то и не так". В порядке бреда — временно отключить антивирус и убедиться перед запуском, что система не загружена ничем другим и есть свободная память.

S>Как тут: http://stackoverflow.com/questions/11984411/application-runs-faster-with-visual-studio-performance-analysis

Уже разобрался — Edge гадил. Проблема была либо в загрузке процессора (возможно студия выставляла affinity для запущенного процесса, поэтому скорость была выше), либо в compressed memory, которая, по-моему, до сих пор кривовато работает.

Когда в следующий раз проблема проявится, попробую разобраться.
ARI ARI ARI... Arrivederci!
Отредактировано 16.01.2017 14:10 Somescout . Предыдущая версия .
Re[7]: Define TRACE constant
От: fddima  
Дата: 17.01.17 09:57
Оценка:
Здравствуйте, Somescout, Вы писали:

S>Уже разобрался — Edge гадил. Проблема была либо в загрузке процессора (возможно студия выставляла affinity для запущенного процесса, поэтому скорость была выше),

Возможно, по какому-нибудь недоразумению, браузер увеличивает точность таймера? После такого обычно всё в системе работает не совсем обычно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.