Thread overview
Dilimler ve Paylaşımın Sonlanması
Nov 10, 2012
Salih Dinçer
Dec 05, 2012
Salih Dinçer
November 10, 2012

Aşağıdaki alıntı şuradan alınmıştır: http://ddili.org/forum/thread/1021

Alıntı (acehreli:1352473477):

>

'dilim ~= 0' yapıldığında 'dilim'in sonuna yeni bir eleman ekleniyor ama orada o elemanın güvenle ekleneceği yer yok (çünkü orada 'rakamlar' diliminin bir elemanı var.).

O zaman D çalışma ortamı (D runtime) 'dilim'in elemanlarını önce yeni bir diziye kopyalar ve dilim'in artık onu göstermesini sağlar. Sonra 'dilim ~= 0' işlemi uygulanırken yeni elemana yer vardır.

Bu konuyla ilgili yazı da şu:

http://ddili.org/makale/d_dilimleri.html

İngilizce aslının bir kopyası da şuradaymış:

http://dlang.org/d-array-article.html

Ali

Peki hocam, aşağıdaki örnekte paylaşımın sonlanması gerekmez mi?

   int[] rakamlar = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ];

   import std.stdio;

void main() {
   auto birDilim = rakamlar[0..$];
   rakamlar.length = 5;

   rakamlar.reverse;
   rakamlar.writeln;
   birDilim.writeln;
}

Çıktısı:
'[4, 3, 2, 1, 0]
[4, 3, 2, 1, 0, 5, 6, 7, 8, 9]'

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

November 10, 2012

Bu konu yalnızca eklenen elemana yer olmaması ile ilgili. Başka dilimin de erişim sağlıyor olabileceği elemana yazılması ile ilgili değil; ve bir dilimin uzunluğunun kısalmasıyla ilgili de değil. (Zaten o yazıda da anlatıldığı gibi, dilimin kendi elemanlarına başka kimin erişim sağladığından haberi yoktur. Haberinin olabilmesi için hem bu bilgiyi tutmak için de yer harcanırdı hem de yavaş olurdu.)

reverse in-place (yerel? yerinde?) bir algoritmadır. rakamlar'ın gösterdiği elemanları ters sıraya çeviriyor.

Bu programda programcı isteyerek bütün elemanları paylaştırmış. Sonra bir nedenle yalnızca baştakileri paylaştırmak istemiş (belki de yalnızca onların ters çevrilmelerinin gerektiğini anlamıştır) (sen olduğunu tabii ki biliyorum. :-p). Sonra da onların yerini değiştirmiş.

Dilimlerin yararını gösteriyor. Hiç indeks hesabı ve eleman kopyası gerekmeden böyle bir işlem gerçekleşebilmiş. Aslında 5'in indeks hesabı olduğunu kabul edebiliriz ama onun yerine popFront() veya popBack() kullanan bir algoritma da olabilirdi.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

December 05, 2012

Bu foruma katılalı ve D'yi öğrenmeye başlayalı zannedersem 1 sene geçti...

O zamanlar dilimler çok ilgimi çekmişti ve ancak şimdi tam manasıyla anlıyorum veya öyle zannediyorum...:)

Az önce ilgili dersi (<ddili.org/ders/d/dilimler.html>) şöyle gözden geçirdim ve paylaşımın sonlanmasında sebep olan durumu bize bildiren capacity() kavramını anlamaya çalıştım. Hızlı kullanım için dinamik dizilerin sonuna 8, 16, 32, 64, 128 ... birim büyüyecek şekilde alan ayrılıyor. Örneğin;

  • 0 eleman ise capacity de 0 oluyor,
  • 1-7 eleman arasındaysa 7,
  • 8-15 eleman arasında 15
  • 16-31 eleman arasında 31
  • 32-63 eleman arasında 63
  • 64-127 eleman arasında 127...

Görüldüğü gibi her seferinde ikiye katlanıyor. Bu durumda mihenk değeri (7, 15, 31...) aşıldığında ve bellek bölümünde yer yoksa ayrılacak olan belleğin yarısı kadar veri tekrar taşınıyor olmalı. Sanırım dizi büyüdükçe baş etmesi gereken veri sürekli katlandığı için performans düşüşü olacak gibi görünüyor. Ama mihenk aralıkları arasındaki mesafe arttığı için her seferinde daha geç (örneğin her saniye diziye 1 veri ekleniyorsa!) bellekten yer ayrılması talebinde bulunacak.

Hoşmuş...:)

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

December 05, 2012

Alıntı (Salih Dinçer):

>

Bu foruma katılalı ve D'yi öğrenmeye başlayalı zannedersem 1 sene geçti...

Tebrikleeer! :)

Alıntı:

>

Sanırım dizi büyüdükçe baş etmesi gereken veri sürekli katlandığı için performans düşüşü olacak gibi görünüyor. Ama mihenk aralıkları arasındaki mesafe arttığı için her seferinde daha geç (örneğin her saniye diziye 1 veri ekleniyorsa!) bellekten yer ayrılması talebinde bulunacak.

Evet. Ona "amortized constant time" denir. Her eleman için ayrılan yer sabit sürede kabul edilir. Yani dizinin büyümesi için harcanan zaman eleman adedinden bağımsızdır.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]