Obecnie pracuję nad programem o krytycznym znaczeniu dla wydajności i jedną ze ścieżek, którą postanowiłem zbadać, która może pomóc w zmniejszeniu zużycia zasobów, było zwiększenie stosu wątków roboczych, aby móc przenieść większość danych float[]
, do których będę uzyskiwać dostęp stos (za pomocą stackalloc
).
Mam przeczytać , że domyślny rozmiar stosu dla wątku jest 1 MB, tak aby przenieść wszystkie moje float[]
s musiałbym rozwinąć stos o około 50 razy (do 50 MB ~).
Rozumiem, że jest to ogólnie uważane za „niebezpieczne” i nie jest zalecane, ale po porównaniu mojego obecnego kodu z tą metodą odkryłem wzrost prędkości przetwarzania o 530% ! Nie mogę więc po prostu pominąć tej opcji bez dalszego dochodzenia, co prowadzi mnie do mojego pytania; jakie niebezpieczeństwa wiążą się ze zwiększeniem stosu do tak dużego rozmiaru (co może pójść nie tak) i jakie środki ostrożności powinienem podjąć, aby zminimalizować takie niebezpieczeństwa?
Mój kod testowy,
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
(nie zapomnij FreeHGlobal
też) przydzielić danych poza pamięć zarządzaną? Następnie rzuć wskaźnik na a float*
i powinieneś zostać posortowany.