Announcement

Collapse
No announcement yet.

Mehrdimensionale Arrays

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Mehrdimensionale Arrays

    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:
    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}
    }
    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.

    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}
    };
    Vergleich der beiden Typen
    • 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();
    		}
    	}
    }
    mfG Gü

    PS: Die pdf-Version kann per privater Nachricht angefordert werden.
    Attached Files
    Zuletzt editiert von gfoidl; 25.09.2008, 14:54.
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

  • #2
    Hallo gfoidl,

    prima, jetzt ist das Dunkel etwas heller geworden.
    Es wäre schön, wenn Du mir auch die PDF-Version schicken könntest

    vG

    fredyx

    Comment

    Working...
    X