C# Multi-Dimensional Array (Dizi) ve Jagged Array (Dizi) arasındaki farklar

Birkaç hafta önce email üzerinden aldığım bir soruyu cevaplamaya çalışacağım.

Soru şu;

C# Multi-Dimensional Array ve Jagged Array arasındaki farklar nedir?

Uzun yıllardır yazılım geliştirme yapıyorum ve deneyimlerime göre Multi-Dimensional Array (Dizi), Jagged Array (Dizi)’ye göre birçok avantaja sahip.

Öncelikle, Multi-Dimensional Array daha doğrusal ve basit bir hafıza yerleşimine (memory map) sahip.

Jagged Array ise, aslında dizilerin dizisi gibi bir modelde olduğu için birçok hafıza içi yönlendirmelere neden oluyor.

Örneğin,

kodu işletildiğinde, CLR, (i x j) kadar (yani 10 x 30 = 300) öğeli bir dizi oluşturur.

multi değişkeninin Length özelliğine bakacak olursak, gerçekten 300 değerini görebiliriz.

Gene multi değişkeninin Rank özelliği, 2 değerine sahip olacak, çünkü multi değişkeni 2 boyutlu bir dizi. 0 ve 1 boyutlarında eşit uzunlukta değerler var.

Hatta GetLength() methodunda 0 veya 1 değerini verecek olursak, i (veya j) uzunluklarını alabiliriz.

Doğal olarak, multi değişkeninin herhangi bir öğesine erişmek, { 1.rakam x i + 2.rakam } indexli elemana erişmek demek;

Multi-Dimensional Array yapılarında veriyi hafızada tutmak, erişmek ve güncellemek, nispeten kolay.

Jagged Array ise, doğrusal bir hafıza haritasına sahip olmadığı için, Multi-Dimensional Array yapılarının sahip olduğu birçok avantaja sahip değildir.

Örneğin,

jagged değişkeninin Rank özelliği her zaman 1 değerine sahiptir.

Bir değere erişmek için Jagged Array değişkenler, şu şekilde davranır;

  • Önce, 10 öğeli dizinin 3 indexli elemanını bul
  • Sonra, 30 öğeli bir dizi olan bu elemanın 6 indexli elemanını bul

Yani, bir elemana ulaşabilmek için, her zaman 2 adımlı yol izlemek gerekiyor.

Ayrıca, Jagged Array yapılarında iki ardışık satırın aynı sayıda öğeli dizi olması zorunlu değil.

Yani yukarıdaki karşılaştırma true değer üretmeyebilir.

Benzetme yapmak gerekirse, Multi-Dimensional Array, bir tablo yapısına benzer, sütun sayısı ve satır sayısı tanımlanır, hücrelere erişilir.

Örneğin;

Bu kodu, 2 x 2 tabloya benzetebiliriz;

Halbuki Jagged Array yapılarında sütun sayıları, her satırda farklı olabilir.

Örneğin;

Bu kod ise, aşağıdaki yapıyı oluşturur;

Performans

Fakat CLR‘ın gerçekleştirdiği çeşitli performans optimizasyonlarından dolayı, Jagged Array yapıları, Multi-Dimensional Array yapılarından daha performanslı çalışıyor.

Örneğin,

Bu methodlardan üretilen IL koduna bakacak olursak;

Gördüğünüz gibi, Multi-Dimensional Array için üretilen IL kodu, Jagged Array için üretilen IL kodundan daha karmaşık ve doğal olarak çalıştırılması da daha uzun sürüyor.

Not : Bu makaleyi geliştirirken Stackoverflow‘dan çok faydalandım

İlgili diğer makaleler

blog comments powered by Disqus

Engin Polat hakkında

Senior Software Engineer, @Microsoft

Ada ve Ege'nin babası ;)

Kategoriler

İstatistik

Makale Adedi: 484

Creative Commons Lisansı