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