Thread overview
February 27, 2013

Unionları kavramaya karar verdim ve çok önceden de pop pushlar ile uğraşıyordum ve bu işlemi slice yerine dizi.length-- yaparak daha hızlı yapacağımı düşünmüştüm ama yanılmıştım. Her nedense length işlevi daha yavaştı. (Saçma gelmişti)

Şimdi ise unionlar ile dizinin uzunluğunu aldım ve direk o uzunluğu değiştirdim. Sonuç slice dan daha hızlı çıktı. Şimdi benim bir sorum var dizi.length işlevi ile aşağıdaki length arasında ne fark var? dizi.length'in başka farklı görevleri mi var? (Belki de kontrollerden dolayıdır -1 e düşmemesi için)

module main;

import std.stdio;
import std.datetime;

import core.memory;

int main(string[] argv){
	union zx{
		int[] dizi;
		int length;
	}
	int[] l;
	for(int i; i<1_000_000;i++) l~=i;
	auto bx = zx(l);

	long a1, a2;
	a1 = Clock.currAppTick().usecs();
	for(int i; i<1_000_000;i++) bx.length--;
	a2 = Clock.currAppTick().usecs();
	writeln(a2-a1);

	a1 = Clock.currAppTick().usecs();
	for(int i; i<1_000_000;i++) l.length--;
	a2 = Clock.currAppTick().usecs();
	writeln(a2-a1);

	a1 = Clock.currAppTick().usecs();
	for(int i; i<1_000_000;i++) l = l[0..$-1];
	a2 = Clock.currAppTick().usecs();
	writeln(a2-a1);

	while(1){
	}

	return 0;
}

Zekeriya

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

February 27, 2013

Sanırım soruma cevap teşkil edebilecek bir şey D.ershane de var.

Alıntı:

>

Yukarıdaki atama basit bir değer değişikliği değildir. length'e yapılan o atamanın arkasında daha karmaşık başka işlemler gizlidir: Dizinin kapasitesinin yeni elemanlar için yeterli olup olmadığına bakılması, gerekiyorsa daha büyük yeni bir yer ayrılması ve dizi elemanlarının o yeni yerin baş tarafına kopyalanmaları.

http://ddili.org/ders/d/nitelikler.html

Sonuç olarak uzunluk kısaltmada işlem güvenli ise bu şekilde union kullanmak mantıklı olabilir.

Zekeriya

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

February 28, 2013

Alıntı:

>

Her testi aynı ortamda başlatmıyorsun. Sonuncu test hatayla sonlanıyor çünkü o teste gelindiğinde dilimin uzunluğu 0 ama sen $-1 indeksini kullanıyorsun.

Haklısınız ama bu yinede sonucu değiştirmedi. Dizi uzunluğunu bir arttırdım sonuç yine aynı çıktı.

Alıntı:

>

Birlikler aynı yere farklı türler yerleştirebilmek içindir. (Variant'ta olduğu gibi.) Birlikler ancak asıl yazılan türün okunmasını desteklerler. Hem dilim hem de int olarak kullanıldığında neler olacağı belirsizdir. Örneğin, burada dilim gerçekleştirmesinin ilk üyesinin uzunluk olduğunu bildiğin için 'int length' ile birlik oluşturuyorsun. Dilimin gerçekleştirmesi değişse öyle olmayabilir.

Hocam bunun böyle olduğunu bilirsek ve hızı gerçekten önemsiyorsak kullanmakta sakınca yok gibi geldi bana. Çünkü slice işlemi esnasında arkaplandaki bazı komutlar sistemi yavaşlatıyor (.length de olduğu gibi)

Alıntı:

>

Dilimin gerçekleştirmesi herhalde uzunluğu size_t olarak tutuyordur. length'i öyle tanımlamanı öneririm.

Düzelttim :)

Alıntı:

>

Yine de, dilim işleminin bu kadar yavaş olması beni şaşırttı. dmd'nin runtime'ının kodlarına bakmak gerek.

Dilim işlevi değil dizi.length işlemi uzun sürüyor.
Yani

int[] dizi = [1,2,3,4,5];
dizi.length--;
dizi=dizi[0..$-1];
/*
length işlevi dilimleme işleminden daha yavaş.
İkisininde aynı hızda olmasını hattat .length--
in daha hızlı olmasını beklerdim. Daha önceden
forumda  bununla ilgili 1 konu açmıştım
ama bir türlü bulamadım :)
*/

Zekeriya

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

February 27, 2013

Her testi aynı ortamda başlatmıyorsun. Sonuncu test hatayla sonlanıyor çünkü o teste gelindiğinde dilimin uzunluğu 0 ama sen $-1 indeksini kullanıyorsun.

Birlikler aynı yere farklı türler yerleştirebilmek içindir. (Variant'ta olduğu gibi.) Birlikler ancak asıl yazılan türün okunmasını desteklerler. Hem dilim hem de int olarak kullanıldığında neler olacağı belirsizdir. Örneğin, burada dilim gerçekleştirmesinin ilk üyesinin uzunluk olduğunu bildiğin için 'int length' ile birlik oluşturuyorsun. Dilimin gerçekleştirmesi değişse öyle olmayabilir.

Dilimin gerçekleştirmesi herhalde uzunluğu size_t olarak tutuyordur. length'i öyle tanımlamanı öneririm.

Yine de, dilim işleminin bu kadar yavaş olması beni şaşırttı. dmd'nin runtime'ının kodlarına bakmak gerek. :)

Ali

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

February 28, 2013

Alıntı (zekeriyadurmus):

>

Alıntı:

>

Her testi aynı ortamda başlatmıyorsun. Sonuncu test hatayla sonlanıyor çünkü o teste gelindiğinde dilimin uzunluğu 0 ama sen $-1 indeksini kullanıyorsun.

Haklısınız ama bu yinede sonucu değiştirmedi. Dizi uzunluğunu bir arttırdım sonuç yine aynı çıktı.

Sonuçla ilgili olarak söylememiştim. Gösterdiğin program açıkça hatalıydı. :) Belki de -release seçeneği ile derlemiş olduğun için dilim işlemi sana o hatayı bildirememişti.

Alıntı:

>

bunun böyle olduğunu bilirsek ve hızı gerçekten önemsiyorsak kullanmakta sakınca yok gibi geldi bana.

(Not: Bu arada, senin union'ı yeğlemediğini biliyorum. Ben de [0..$-1] daha hızlı çıkıyor. Aşağıda söylediklerim union'lı kodla ilgili.)

Bunları daha önce de konuştuk ama hızı kim önemsemez ki? :) Sen burada bir karşılaştırma yapıyorsun ve hızlı çalışmayı olasılıkla hatalı çalışmaya üstün tutuyorsun. Bunu, dilim gerçekleştirmesinin .length-- işleminin arkasında tam olarak neler yaptığını tahmin ederek seçiyorsun.

O tahmin de şu: Herhalde yalnızca length üyesinin değerini bir değiştiriyordur. Aslında öyle değil. .length, bir nitelik işlevi ve şunun eşdeğeri:

   dilim.length = dilim.length - 1;

Yani dilim aslında uzunluğunun bir eksiltildiğini bilmiyor ve onun için .length'e bir atama yapıldığındaki işlemleri gerçekleştiriyor. Örneğin, uzunluğun artıp artmadığına bakıyor. Bunun D'de hiçbir zaman değişeceğini de sanmıyorum. Çünkü nitelikler yapılarda ve sınıflarda da var ve bu olanak o türlere açıldığında ortalığın korkunç karışacağını görebiliyorum: "length diye bir nitelik olsun; eksilme işleminde şu işlev çağrılsın, arttırma işleminde öteki çağrılsın, vs." gibi. Karmaşık iş. Onun için yukarıdaki gibi bir atamaya dönüştürülmesi çok daha uygun.

İsteyen tür daha hızlı olma adına kendisi sondakiniÇıkart() gibi bir işlev tanımlayabilir ve bu dertten kurtulur. Dilimlerin böyle bir olanak sunmadıklarına üzülebiliriz. :)

Alıntı:

>

Çünkü slice işlemi esnasında arkaplandaki bazı komutlar sistemi yavaşlatıyor (.length de olduğu gibi)

İşte sen o işlemlerin ne olduklarını biliyorsun ve dilimin uzunluk üyesini doğrudan değiştirmenin de güvenli olduğunu biliyorsun.

Alıntı:

>

Dilim işlevi değil dizi.length işlemi uzun sürüyor.

Evet, onu demek istemiştim. Ama yukarıdaki kodu düşününce açıklığa kavuştu.

Sonuçta, tabii ki istediğini yapabilirsin ama başkasının yazmış olduğu bir yapının üyesini değiştirmek ve doğru işlemesini beklemek pek akıllıca değil.

Ali

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