В настоящее время я работаю над очень критичной для производительности программой, и один путь, который я решил изучить, что может помочь уменьшить потребление ресурсов, увеличил размер стека моих рабочих потоков, чтобы я мог перемещать большую часть данных (float[]
s), которые Я буду подключаться к стеку (используя 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;
}
}