Ich arbeite derzeit an einem sehr leistungskritischen Programm. Ein Pfad, den ich untersuchen wollte, um den Ressourcenverbrauch zu senken, bestand darin float[]
, die Stapelgröße meiner Arbeitsthreads zu erhöhen, damit ich die meisten Daten verschieben kann, auf die ich zugreifen werde der Stapel (mit stackalloc
).
Ich habe gelesen, dass die Standardstapelgröße für einen Thread 1 MB beträgt. Um also alle meine float[]
s zu verschieben, müsste ich den Stapel um ungefähr das 50-fache (auf 50 MB ~) erweitern.
Ich verstehe, dass dies im Allgemeinen als "unsicher" eingestuft wird und nicht empfohlen wird, aber nachdem ich meinen aktuellen Code mit dieser Methode verglichen habe, habe ich eine Steigerung der Verarbeitungsgeschwindigkeit um 530% festgestellt ! Ich kann diese Option also nicht einfach ohne weitere Untersuchung umgehen, was mich zu meiner Frage führt. Welche Gefahren sind mit der Vergrößerung des Stapels auf eine so große Größe verbunden (was könnte schief gehen), und welche Vorsichtsmaßnahmen sollte ich treffen, um solche Gefahren zu minimieren?
Mein Testcode,
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
(nicht zu vergessen FreeHGlobal
), die Daten außerhalb des verwalteten Speichers zuzuweisen ? Setzen Sie dann den Zeiger auf a float*
, und Sie sollten sortiert sein.