Hallo,
bekanntlich gibt es in .net für mehrdimensionale Arrays 2 Möglichkeiten.
Nachfolgend ein kurze Beschreibung.
Rechteckiges Array
Wenn die Matrix zugeordnet wird, wird ein einzelner Speicherbereich im Heap für den gesamten Array verwendet.
Erstellt kann ein solches Array mit folgendem Code werden:
Unregelmäßige Arrays
Ist lediglich ein Array von Arrays und wird deshalb unregelmäßig bezeichnet, da dieses Array nicht rechteckig sein muss. Die Variable matrix verweist auf ein Array, das wiederum auf drei Arrays verweist. Für dieses Array sind im Heap vier Zuordnungen erforderlich.
Vergleich der beiden Typen
Die Gründe für die unterschiedliche Performance liegen darin dass der JIT-Compiler für Arrays (eindimensinale) optimiert ist und ein jagged Array eben ein Array von Arrays ist.
Für Matrizen in Form rechteckiger Arrays sind zusätzliche Overhead-Funktionen nötig.
Der Vergleich wurde mit folgendem Code erstellt.
mfG Gü
PS: Die pdf-Version kann per privater Nachricht angefordert werden.
bekanntlich gibt es in .net für mehrdimensionale Arrays 2 Möglichkeiten.
Nachfolgend ein kurze Beschreibung.
Rechteckiges Array
Wenn die Matrix zugeordnet wird, wird ein einzelner Speicherbereich im Heap für den gesamten Array verwendet.
Erstellt kann ein solches Array mit folgendem Code werden:
Code:
int[,] matrix1 = new int[4, 3]; matrix1[0, 0] = 1; matrix1[3, 2] = 12; int[,] matrix2 = // ergibt int[2, 3] { {1, 2, 3}, {4, 5, 6} }
Ist lediglich ein Array von Arrays und wird deshalb unregelmäßig bezeichnet, da dieses Array nicht rechteckig sein muss. Die Variable matrix verweist auf ein Array, das wiederum auf drei Arrays verweist. Für dieses Array sind im Heap vier Zuordnungen erforderlich.
Code:
int[][] matrix1 = new int[3][]; matrix[0] = new int[3]; matrix[1] = new int[4]; matrix[2] = new int[2]; int[][] matrix2 = { new int[] {1, 2, 3}, new int[] {1, 2, 3, 4}, new int[] {1, 2} };
- Jagged Arrays sind großteils leichter handzuhaben (zB bei der Sortierung).
- bei wahlfreiem Zugriff (random access) sind rechteckige Arrays performanter
- bei sequentiellem Zugriff sind jagged Arrays um Ecken besser (siehe Abbildung)
Die Gründe für die unterschiedliche Performance liegen darin dass der JIT-Compiler für Arrays (eindimensinale) optimiert ist und ein jagged Array eben ein Array von Arrays ist.
Für Matrizen in Form rechteckiger Arrays sind zusätzliche Overhead-Funktionen nötig.
Der Vergleich wurde mit folgendem Code erstellt.
Code:
using System; using System.Diagnostics; using System.IO; namespace Vergleich_jagged_vs_rechteckig { class Program { static void Main(string[] args) { #region Deklaration der Variablen const int N = 10000; int[,] regularArray = new int[100, 100]; int[][] jaggedArray = new int[100][]; for (int i = 0; i < 100; i++) jaggedArray[i] = new int[100]; Stopwatch watch = new Stopwatch(); StreamWriter sw = new StreamWriter("Result.txt"); #endregion #region Vergleich beim Schreiben #region Rechteckiges Array watch.Reset(); watch.Start(); for (int k = 0; k < N; k++) { for (int i = 0; i < 100; i++) { for (int j = 0; j < 100; j++) regularArray[i, j] = i * j; } } watch.Stop(); Console.WriteLine( "Schreiben - rechteckig: {0} Ticks", watch.ElapsedTicks); sw.WriteLine( "Schreiben - rechteckig: {0} Ticks", watch.ElapsedTicks); #endregion #region Jagged Array watch.Reset(); watch.Start(); for (int k = 0; k < N; k++) { for (int i = 0; i < 100; i++) { for (int j = 0; j < 100; j++) jaggedArray[i][j] = i * j; } } watch.Stop(); Console.WriteLine( "Schreiben - jagged: {0} Ticks", watch.ElapsedTicks); sw.WriteLine( "Schreiben - jagged: {0} Ticks", watch.ElapsedTicks); #endregion #endregion #region Vergleich beim Lesen #region Rechteckiges Array watch.Reset(); watch.Start(); for (int k = 0; k < N; k++) { for (int i = 0; i < 100; i++) { for (int j = 0; j < 100; j++) { int zahl = regularArray[i, j]; } } } watch.Stop(); Console.WriteLine( "Lesen - rechteckig: {0} Ticks", watch.ElapsedTicks); sw.WriteLine( "Lesen - rechteckig: {0} Ticks", watch.ElapsedTicks); #endregion #region Jagged Array watch.Reset(); watch.Start(); for (int k = 0; k < N; k++) { for (int i = 0; i < 100; i++) { for (int j = 0; j < 100; j++) { int zahl = jaggedArray[i][j]; } } } watch.Stop(); Console.WriteLine( "Lesen - jagged: {0} Ticks", watch.ElapsedTicks); sw.WriteLine( "Lesen - jagged: {0} Ticks", watch.ElapsedTicks); #endregion #endregion sw.Close(); sw.Dispose(); Console.ReadKey(); } } }
PS: Die pdf-Version kann per privater Nachricht angefordert werden.
Comment