(. Кстати это относится к 32-битной ОС)Выравнивание памяти классов в C#?
Некоторые обновления:
Это, безусловно, проблема выравнивания
Иногда выравнивание настолько плохо, что (по какой-либо причине?) доступ к двойнику более чем в 50 раз медленнее, чем его быстрый доступ.
Запуск кода на 64-битной машине разрешает проблему, но я думаю, что она по-прежнему чередовалась между двумя моментами (из которых я мог получить аналогичные результаты, изменив двойное на поплавок на 32-битной машине)
Запуск кода под моно экспонированиями без проблем - Microsoft, любой шанс вы можете что-то скопировать из тех ребят Novell ???
Есть ли способ памяти выравнивать распределение классов в C#?
Следующие демонстрируют (я думаю!), Что плохое совпадение партией правильное. Он выполняет некоторую простую математику в двойном хранилище, хранящемся в классе, каждый раз запустив, запустив 5 временных циклов переменной, прежде чем распределять новую и делать это снова.
В основном результаты выглядит, как вы либо иметь быстрый, средний или медленный позиции памяти (на моем древнем процессоре, они в конечном итоге около 40, 80 или 120мс за бега)
Я пытался играть с StructLayoutAttribute, но не было радости - может быть, что-то еще происходит?
class Sample
{
class Variable { public double Value; }
static void Main()
{
const int COUNT = 10000000;
while (true)
{
var x = new Variable();
for (int inner = 0; inner < 5; ++inner)
{
// move allocation here to allocate more often so more probably to get 50x slowdown problem
var stopwatch = Stopwatch.StartNew();
var total = 0.0;
for (int i = 1; i <= COUNT; ++i)
{
x.Value = i;
total += x.Value;
}
if (Math.Abs(total - 50000005000000.0) > 1)
throw new ApplicationException(total.ToString());
Console.Write("{0}, ", stopwatch.ElapsedMilliseconds);
}
Console.WriteLine();
}
}
}
Таким образом, я вижу много веб-страниц о выравнивании структур для взаимодействия, так как насчет выравнивания классов?
(Или мои предположения не так, и есть еще одна проблема с выше?)
Спасибо, Paul.
Я не могу воспроизвести проблему (на x64 с рамками 3.5 и 4B2). Все проходы имеют схожую скорость, за исключением очень случайного медленного хода, где, по-видимому, GC делает свои вещи. – LukeH
Это было на 32-битной машине - я пробовал пару разных машин с одинаковыми результатами. Я дам ему капельку на 64-битной машине ... –
Как вы определяете ее выравнивание, это проблема, а не прочее (например, gc или подобное)? – nos