(кстати, это относится к 32-разрядной ОС)
НЕКОТОРЫЕ ОБНОВЛЕНИЯ:
-
Это определенно проблема выравнивания
-
Иногда выравнивание (по какой-либо причине?) настолько плохо, что доступ к двойнику более чем на 50 раз медленнее, чем его быстрый доступ.
-
Запуск кода на 64-битной машине разрешает проблему, но я думаю, что он все еще чередовался между двумя моментами (из которых я мог получить аналогичные результаты, изменив double на float на 32-битной машине)
-
Запуск кода под моно не вызывает проблем - Microsoft, любой шанс, что вы можете скопировать что-то из тех ребят Novell???
Есть ли способ памяти выровнять распределение классов в С#?
Следующее демонстрирует (я думаю!), что плохое совпадение удваивается правильно. Он выполняет некоторую простую математику в двойном хранилище, хранящуюся в классе, каждый раз при каждом запуске запускает 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();
}
}
}
Итак, я вижу много веб-страниц о выравнивании структур для взаимодействия, так что насчет выравнивания классов?
(Или мои предположения ошибочны, и есть еще одна проблема с этим?)
Спасибо, Пол.