Forum: Ders Arası RSS
Dilimler ve Paylaşımın Sonlanması
Avatar
Salih Dinçer #1
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Dilimler ve Paylaşımın Sonlanması
Aşağıdaki alıntı şuradan alınmıştır: http://ddili.org/forum/thread/1021

acehreli on 2012-11-09, 07:04:
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]
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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
Avatar
Salih Dinçer #3
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
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 şö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ş...:)
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #4
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Salih Dinçer:
Bu foruma katılalı ve D'yi öğrenmeye başlayalı zannedersem 1 sene geçti...

Tebrikleeer! :)

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
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Forum: Ders Arası RSS
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-18, 22:43:07 (UTC -08:00)