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;
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
Senior Software Engineer, @Microsoft
Ada ve Ege'nin babası ;)
Makale Adedi: 484