Я возможно чего-то не понимаю, но при включении этой опции в настройках проекта скорость падает в >3 раза. Почему она по умолчанию включена для Release-билда? Почему в среде студии программа выполняется будто она выключена (то есть — если запустить Release build в студии в режиме отладки, он выполнится быстро, тот же билд запущеный извне — медленно, тот же билд с выключенным TRACE извне — быстро...)?
Причём разница в скорости проявляется в тестовой программе, которая мучает исключительно память и процессор, не вызывая непосредственно framework.
Здравствуйте, Somescout, Вы писали:
S>Я возможно чего-то не понимаю, но при включении этой опции в настройках проекта скорость падает в >3 раза.
Что-то в лог пишет, очевидно. Проверяй, что за listeners в appconfig подключены.
Я бы снял в профайлере снапшоты для варианта с и без TRACE constant и сравнил. Ну, или давай код, который воспроизводит проблему. Без него долго гадать можно
Здравствуйте, Sinix, Вы писали:
S>Что-то в лог пишет, очевидно. Проверяй, что за listeners в appconfig подключены.
Так дефолтный проект, в appconfig только запись о версии фреймворка.
S>Я бы снял в профайлере снапшоты для варианта с и без 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.csprivate 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);
}
}
Разница хоть и стала меньше, но всё равно стабильно присутствует. И да, похоже TRACE на это не влияет.
PS — IPS, в данном случае ведь не instructions per second?
PS2. Допускаю что проблема в системе, но непонятно какая.
UPD. Действительно, на другом компьютере не воспроизводится. Буду разбираться кто гадит.
UPD2. Закрыл браузер, скорости выровнялись. Странно почему в студии быстрее работало — может она для себя и дочерних процессов affinity выставляет? Как браузер снова потолстеет, попробую разобраться.
Здравствуйте, Somescout, Вы писали:
S>Разница хоть и стала меньше, но всё равно стабильно присутствует. И да, похоже TRACE на это не влияет.
Ага, т.е. релизный код в режиме отладки работает быстрее, чем запущенный по ctrl-F5?
Запускается точно не отладочная версия?
Уже разобрался — Edge гадил. Проблема была либо в загрузке процессора (возможно студия выставляла affinity для запущенного процесса, поэтому скорость была выше), либо в compressed memory, которая, по-моему, до сих пор кривовато работает.
Когда в следующий раз проблема проявится, попробую разобраться.
Здравствуйте, Somescout, Вы писали:
S>Уже разобрался — Edge гадил. Проблема была либо в загрузке процессора (возможно студия выставляла affinity для запущенного процесса, поэтому скорость была выше),
Возможно, по какому-нибудь недоразумению, браузер увеличивает точность таймера? После такого обычно всё в системе работает не совсем обычно.