Надеюсь, что это действительный пост, это комбинация проблем C # и аппаратного обеспечения.
Я тестирую наш сервер, потому что мы обнаружили проблемы с производительностью нашей квантовой библиотеки (написанной на C #). Я смоделировал те же проблемы с производительностью с некоторым простым кодом C #, выполняющим очень интенсивное использование памяти.
Код ниже находится в функции, которая порождается из пула потоков, максимум до 32 потоков (потому что наш сервер имеет 4x ЦП x 8 ядер в каждом).
Это все на .Net 3.5
Проблема в том, что мы получаем совершенно отличную производительность. Я запускаю функцию ниже 1000 раз. Среднее время, необходимое для выполнения кода, может быть, скажем, 3,5 с, но самое быстрое будет только 1,2 с, а самое медленное будет 7 с - для точно такой же функции!
Я составил график использования памяти в зависимости от времени, и, похоже, нет никакой связи с включением GC.
Одна вещь, которую я заметил, заключается в том, что при работе в одном потоке сроки идентичны и нет диких отклонений. Я также протестировал алгоритмы с привязкой к процессору, и время их работы тоже идентично. Это заставляет нас задуматься, не справится ли шина памяти.
Мне было интересно, может ли это быть другой проблемой .net или C #, или это связано с нашим оборудованием? Было бы то же самое, если бы я использовал C ++ или Java ?? Мы используем 4x Intel x7550 с 32 ГБ оперативной памяти. Есть ли способ обойти эту проблему вообще?
Stopwatch watch = new Stopwatch();
watch.Start();
List<byte> list1 = new List<byte>();
List<byte> list2 = new List<byte>();
List<byte> list3 = new List<byte>();
int Size1 = 10000000;
int Size2 = 2 * Size1;
int Size3 = Size1;
for (int i = 0; i < Size1; i++)
{
list1.Add(57);
}
for (int i = 0; i < Size2; i = i + 2)
{
list2.Add(56);
}
for (int i = 0; i < Size3; i++)
{
byte temp = list1.ElementAt(i);
byte temp2 = list2.ElementAt(i);
list3.Add(temp);
list2[i] = temp;
list1[i] = temp2;
}
watch.Stop();
(код предназначен только для того, чтобы подчеркнуть память)
Я бы включил код пула потоков, но мы использовали нестандартную библиотеку потоков пула.
РЕДАКТИРОВАТЬ: я уменьшил "size1" до 100000, который в основном не использует много памяти, и я все еще получаю много дрожания. Это говорит о том, что это не объем передаваемой памяти, а частота захвата памяти?