February 25, 2013

GitHubta şu an son kodlar var :)

Kodları çalıştırdığınızda ekrana kaç mikrosaniye yazdığını gösteren bir çıktı veriyor. 1_000_000 döngü içerisine koyuyorum test edeceğim operandı ve yanına karşılığını yazıyorum.

Zekeriya

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

February 25, 2013

Hocam test işlemleri için ufak bir kod yazdım. Şimdi son halini githuba attım.

Aşağıdaki gibi main.d içinden kod yazınca çalışıyor şu an. İsterseniz test kısmından da farklı işlemleri test edebilirsiniz.

a = 1 * 10 + 20 + 5
b = a * 20
print(a, b)

Zekeriya

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

February 25, 2013

Bende main.d ve vm.d'de bazı değişiklikler yaptım...

Bilmiyorum gerekli miydi ama bir switch() önünde TEST isminde enum gördüm. Bunun kullanılmadığını anlayınca sınıf dışına taşıdım ve VM'nin kurucusuna test parametresi ekledim. Bu şekilde üçünden biri seçilebildiği gibi hiç bir şey yazılmaz ise eskisi gibi görüntü gelecek. Tabi test adetini de belirleyen bir değişken ekledim.

Benim bilgisayarımdaki test sonucu, ortalama 58 bin/aMillionLoop

Özeyle bunlara gerek var mıydı, yoksa başka bir şekilde mi test ediyordun? Ayrıca önceki sayfada yer alan ayrıntılı test sonuçlarını elde edemedim. Gizlediğin satırları açınca da geç sürmesi dışında hiç bir şey olmadı. Neyse, ben opimizasyona geçiyorum...:)

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

February 25, 2013

Hocam her bir operandı test etmek için olan kodları ben sizin commitden önce githuba atmıştım :) Görmediniz sanırım.

Şimdi o değişiklikleri sizin değişikliğiniz ile birlikte tekrar atıyorum. Test edeceğiniz değeri değiştirerek istediğiniz operandı test edersiniz :)

Zekeriya

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

February 25, 2013

Salih hocam acaba op içindeki ps ile addr yi birleştirsek opu kaldırsak hızda dikkate değer bir artış yaşanır mı?

Zekeriya

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

February 26, 2013

Gece kodu biraz inceledim ve uyuya kalmışım! Şimdi uyandım ama devam edeceğim...:)

Düzeltmelere gelince; bunu birlikte ve adım adım yapmalıyız. Eğer patırdanak diye bir çok şeyi düzeltmeye kalkarsam kod çalışır gibi görünüp çalışmaz hale gelebilir. Peki hız değerleri dışında kodun gerçekten çalıştığına (iç kodun çalışıp değer ürettiğine) emin olabilir muyuz? Bunun an itibariyle hızdan daha önemli olduğunu düşünüyorum...

Eğer kabül edersen ilk olarak çok şişmiş olan interpret() işlevinden başlayalım derim. Bunu eğer mümkünse ayrı bir dosyaya alıp o şekilde çalıştırılabilir hale getirmeliyiz. Sonra, asıl etkili olan adımı atacağız inşaallah!

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

February 26, 2013

Dediğiniz gibi şu aşamayı geçmeden yeni birşeyler yapmak anlamsız olacaktır. Olan sistemi iyileştirmek gerek.

Alıntı:

>

Peki hız değerleri dışında kodun gerçekten çalıştığına (iç kodun çalışıp değer ürettiğine) emin olabilir muyuz?

Şu an için sadece operandlarla ilgileniyorum. Parser, lexer ve paraphrase işlemleri ile ilgilenmiyorum. Şu an için testlerde operandlarda bir sıkıntı yok. Ve testi yapabilmemiz için gerekli operandlardan fazlası da yok sistemde.
Örneğin değişken çağırmak, değişken tanımlamak, int++, basit koşul yapısı gibi. Testlerde bunları bir arada kullanacağız zaten.

Alıntı:

>

Eğer kabül edersen ilk olarak çok şişmiş olan interpret() işlevinden başlayalım derim. Bunu eğer mümkünse ayrı bir dosyaya alıp o şekilde çalıştırılabilir hale getirmeliyiz. Sonra, asıl etkili olan adımı atacağız inşaallah!

Olur siz nasıl uygun görürseniz. Ayrı bir dosya derken sadece operandlarla ilgili kısmı kast ediyorsanız olumlu sonuç vermez bence. Çünkü değişkenler de işin içinde olması lazım. Önceki testlerimizde bunları hesaba katmadan yaptık ve şu anki sistemden kat kat daha hızlı bir sonuç elde ettik.(D deki hızından 1 kat yavaş :) ) Ama dediğim gibi bu testler çoğu şeyden bağımsızdı (türler,tür işlevleri, tür kontrolleri gibi) bu da şimdiki sonuçtan farklı bir sonuç elde etmemizi son derece hızlı gözüken bir kod elde etmemize neden oldu. Bu yüzden uygun ortamın sağlanması gerekiyor.

Şimdi ne yapıyoruz? Malloc ile ilgili ne düşünüyorsunuz?

Zekeriya

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

February 26, 2013

Hocam is_equal operandı çalışırken var() çağırılıyor ve içerisinde malloc kullanılıyor ya hani onun yerine bir bool dizisi oluşturup boolptr değişkenine de dizinin o anki adresini yazdım.

bool[] booldizi;
bool* boolptr;
..................
booldizi = new bool[](2_000_000);
boolptr = &booldizi[0];
..................
	this(bool val = true){
		*boolptr=val;
		this.val = boolptr;
		boolptr++;
//		this.val = cast(bool*) core.stdc.stdlib.malloc(bool.sizeof);
//		*cast(bool*) this.val = val;
		this.typ = DT.BOOL;
	}

Ve hız 35 bine kadar indi. Malloc var iken 60bin idi. Bu şekilde kullanmak doğru değil biliyorum ama buna yakın bir yöntem var mıdır?

Zekeriya

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

February 26, 2013

Hocam bu arada diğer testlerde (operandlar için olan)

list ~= op(HLT);

bu kodu eklemeyi unutmuşum o yüzden test hata veriyor. Eğer test yapacaksanız eklemeyi unutmayın :)

Zekeriya

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

February 26, 2013

İstersen malloc() olayına sonraya bırakalım. Sonuçta bizim için güvenli bellek tahsisi öncelikli. Hız zaten bir şekilde gelecek inşaallah. Ama güvenden ödün verirsek bu sefer hızın hiç bir esprisi kalmayacak...:)

Bu arada hız demişken, arada PHP ile karşılaştırma yapıyoruz. Eğer işleç çarkları (operands) içi boş adres dallanmalarından ibaret ise PHP'ye ne kadar yaklaştığımızı nasıl bilebiliyoruz? Bence en azından iki sayıyı çarpmayı yapmalıyız. Sonuçta kaydediciler (registers) etkin bir şekilde kullanılıyor. Sanırım bir tek işlemi yapıp başka bir kaydediciye kayıt etmek. Ayrıca print() olayı da önemli. Aslında burada stack mantığını devreye sokmak faydalı da olabilir.

Alıntı (zekeriyadurmus):

>

Hocam bu arada diğer testlerde (operandlar için olan)

> list ~= op(HLT);
> ```
bu kodu eklemeyi unutmuşum o yüzden test hata veriyor. Eğer test yapacaksanız eklemeyi unutmayın :)
>
> Zekeriya
>
Evet, o bölümü tek bir if() ile şu hale getirdim ama güncellemedim. Sanırın test kodları gayet iyi çalışıyor ve bunun üzerinde durmamıza gerek kalmayacak. Tebrik ederim...

	with(OP){
		final switch(test){
			case TEST.print:
				list ~= op(LOAD,		1, 0);
				list ~= op(VARIABLE,	0, "print");
				list ~= op(LOADPARAM,	1);
				list ~= op(CALL,		0);
				list ~= op(INC,			1);
				list ~= op(GOTO,		1);
				break;
			case TEST.aMillionLoop:
				list ~= op(LOAD,		0, 1_000_000);
				list ~= op(LOAD,		1, 0);
				list ~= op(DEFINE,		1, "i");
				list ~= op(VARIABLE,	1, "i");
				list ~= op(INC,			1);
				list ~= op(IS_EQUAL,	2, 0, 1);
				list ~= op(JNE,			2, 4);
				break;
			case TEST.operand_load://4909 ms
				for(int z; z<1_000_000; z++) list~=op(LOAD, 0, "test");
				break;
			case TEST.operand_variable://41264 ms
				for(int z; z<1_000_000; z++) list~=op(VARIABLE,0, "print");
				break;
			case TEST.operand_next://2642 ms
				for(int z; z<1_000_000; z++) list~=op(NEXT);
				break;
			case TEST.operand_inc://9430 ms
				list~=op(LOAD, 0, 0);
				for(int z; z<1_000_000; z++) list~=op(INC, 0);
				break;
			case TEST.operand_goto://6983 ms
				for(int z; z<1_000_000; z++) list~=op(GOTO, z+2);
				break;
			case TEST.operand_is_equal://56307 ms
				list~=op(LOAD, 0, 5);
				list~=op(LOAD, 1, 20);
				for(int z; z<1_000_000; z++) list~=op(IS_EQUAL, 2,0, 1);
				break;
			case TEST.operand_loadparam://4732 ms
				list~=op(LOAD, 0, 5);
				for(int z; z<1_000_000; z++) list~=op(LOADPARAM, 0);
				break;
			case TEST.operand_call://20226 ms
				list~=op(VARIABLE, 0, "print");
				for(int z; z<1_000_000; z++) list~=op(CALL, 0);
				break;
			case TEST.operand_define://35822 ms
				list~=op(VARIABLE, 0, "print");
				for(int z; z<1_000_000; z++) list~=op(DEFINE, 0, "yaz");
				break;
			case TEST.operand_times://46959 ms
				list~=op(LOAD, 0, 20);
				list~=op(LOAD, 0, 50);
				for(int z; z<1_000_000; z++) list~=op(TIMES, 2, 0, 1);
				break;
			case TEST.fromParser:
				foreach(token;tokens) paraphrase(list,token);
				break;
		}
		if(test) list~=op(HLT);                 /* Salih ekledi */
	}
	startp = &list[0];
	cur = &list[0];
	adr = (*cur).addr;
	test.writeln(" çalışmaya başladı...");    /* Salih ekledi */
	start = Clock.currAppTick().usecs();
	asm{jmp adr;}
	end:
		writefln("Program çalışmayı bitirdi.\nGeçen süre: %s",finish - start);
	return;

**Dip Not:** Eve yeni geldim, biraz uyuyabilirsem gece kalkıp bahsettiğim interpret.d modülü üzerine çalışacağım.

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