В настоящее время я работаю над очень важной для производительности программой, и одним из путей, который я решил изучить, который может помочь снизить потребление ресурсов, было увеличение размера стека моих рабочих потоков, чтобы я мог перемещать большинство данных, к float[]
которым я буду получать доступ стек (использование stackalloc
).
Я читал, что размер стека по умолчанию для потока равен 1 МБ, поэтому для перемещения всех моих float[]
файлов мне потребуется расширить стек примерно в 50 раз (до 50 МБ ~).
Я понимаю, что это обычно считается «небезопасным» и не рекомендуется, но после сопоставления моего текущего кода с этим методом я обнаружил увеличение скорости обработки на 530% ! Так что я не могу просто пройти мимо этого варианта без дальнейшего расследования, что приводит меня к моему вопросу; Каковы опасности, связанные с увеличением стека до такого большого размера (что может пойти не так), и какие меры предосторожности я должен предпринять, чтобы минимизировать такие опасности?
Мой тестовый код,
public static unsafe void TestMethod1()
{
float* samples = stackalloc float[12500000];
for (var ii = 0; ii < 12500000; ii++)
{
samples[ii] = 32768;
}
}
public static void TestMethod2()
{
var samples = new float[12500000];
for (var i = 0; i < 12500000; i++)
{
samples[i] = 32768;
}
}
Marshal.AllocHGlobal
(не забывайте и об этом FreeHGlobal
) выделять данные за пределами управляемой памяти? Затем наведите указатель на a float*
, и вы должны быть отсортированы.