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