Jump to page: 1 26  
Page
Thread overview
Kod Optimizasyonu Hakkında
Feb 23, 2013
Salih Dinçer
Feb 23, 2013
Salih Dinçer
Feb 23, 2013
Salih Dinçer
Feb 24, 2013
Salih Dinçer
Feb 24, 2013
Salih Dinçer
Feb 24, 2013
Salih Dinçer
Feb 24, 2013
Salih Dinçer
Feb 25, 2013
Salih Dinçer
Feb 25, 2013
Salih Dinçer
Feb 25, 2013
Salih Dinçer
Feb 25, 2013
Salih Dinçer
Feb 26, 2013
Salih Dinçer
Feb 27, 2013
Salih Dinçer
Feb 27, 2013
Salih Dinçer
Feb 27, 2013
Salih Dinçer
Feb 27, 2013
Salih Dinçer
Feb 27, 2013
Salih Dinçer
February 23, 2013

Salih hocam, Ali hocam D'nin belki + özelliği gibi dursada benim başıma dert olan birşey var. Kod optimazsyonu.

op_is_equal: asm{ call adresal; }
	stack ~= datatypes[stack[$-2].typ].isEqual(stack[$-2], stack[$-1]);
	mixin(next);
op_call: asm{ call adresal; }
	writeln(datatypes[stack[$-1].typ].call);// Bu satırı kaldırırsam hata veriyor kaldırmazsam
//hata vermiyor
	datatypes[stack[$-1].typ].call(stack[$-1], params);

Bir önceki satırda data typ ile ilgili birkaç işlem yapıldığı için aynı işlemleri(asm kodları) op_call da yapmıyor kodların sırayla çalışacağını düşünerek. Ama bu beni zor duruma sokuyor bunu iptal etmenin bir yolu yok mu?

Sorunumu tam olarak anlatamamış olabilirim.

Zekeriya

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

February 23, 2013

Veya benzer şekilde

auto z = stack[$-1];
datatypes[stack[$-1].typ].call(z, params);

Böyle yaptığımda hata vermiyor. Ama bu şekilde yapmak bana performans kaybettiriyor D nin bu kod optimizasyonunu kısa süreli de olsa iptal etmenin yolu yok mu?

Zekeriya

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

February 23, 2013

Çok ilginç bir çözüm getirdim. Tahminimce sistemi yavaşlatmazda :)

with(lx){
op_is_equal: asm{ call adresal; }
	stack ~= datatypes[stack[$-2].typ].isEqual(stack[$-2], stack[$-1]);
	mixin(next);
}
with(lx){
op_call: asm{ call adresal; }
	datatypes[stack[$-1].typ].call(stack[$-1], params);
	params = null;
	mixin(next);
}

Bu şekilde with içerisine alınca hepsi birbirinden bağımsız oluyor :) Ve kod hata vermiyor

Zekeriya

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

February 23, 2013

Özür dilerim :) Çalışma zamanı hatası veriyor. Hata da Access Violation.

Alıntı:

>

Söylediklerinden optimizasyon yapıldığı için performans kaybı oluyor gibi bir anlam çıkartıyorum. Çelişkili.

Kodlar hiç çalışmıyor :( örneğin bir üst satırda stack ile ilgili işlem yapıldığı için tekrar aynı kodu yazma gereği duymuyor. Zaten üstte var diye ama ben üstteki kodlara hiç girmiyorum ki.

Alıntı:

>

Salt kapsam parantezi de oluyor mu yoksa with şart mıymış?

Kodları birbirinden ayıracak şekilde araya birşey atınca orada çalıştı. Ama başka bir yerde yine hata verdi.

		with(lx){
		op_call: asm{ call adresal; }
			writeln(stack[$-1].typ);//bu kodda burası
//silinince hata veriyor :) Runtime error access violation
			writeln(datatypes[stack[$-1].typ].call);
			datatypes[stack[$-1].typ].call(stack[$-1], params);
			params = null;
			mixin(next);
		}

Alıntı:

>

Bu durumu küçücük bir programla gösterebilir misin?

Gösterebilir miyim bilmiyorum :( ama deneyeceğim.

Zekeriya

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

February 23, 2013

Hocam en basitinden

auto s1 = stack[$-2];
auto s2 = stack[$-1];
writeln(s1);//bununla
stack.length -= 2;
writeln(s1);//bunun çıktısı aynı değil :( tür değeri sapıtıyor. Çöp toplayıcı iptal etmeme rağmen bu sorun devam ediyor ne yapacağımı şaşırdım :(

Zekeriya

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

February 23, 2013

Haydi kodu optimize edelim ama senden bir ricam var...

Kod daha fazla karışmadan düzeltene kadar artık tek bir değişken bile eklemeyeceksin...:)

Bilemiyorum, belki de bir kaç sürüm geri gidip tekrar mı yazsak? Yanlış bir söz de etmek istemiyorum ve hissettiklerimi nasıl tarif edeceğimi bilmiyorum. Buna lütfen aşağıdaki + ve -'lerin sayısına bakarak sen karar ver. Henüz bu satırı yazıyorken açıkçası adetlerini bende bilmiyorum...:D

  • rhs isminde bir VM sınıfının kopyası var ve bunun try catch içerisinde execute ismindeki üyesini çağırıyorsun,
  • Bu işlev ilk olarak load() isminde başka bir işlevi çağırıyor ama bunun yerini yurdunu kimse bilmiyor:
    ** Meğer VM, Parser'den türermiş, Parser'de Lexer'dan, böyle işlevin yerini buluyoruz...
    ** Meğer load() Lexer sınıfı içindeymiş o yüzden isminin loadLexer() olmasını öneriyorum?
    ** Meğer işlevimiz bağlı olduğu sınıftaki üyelere (''char[] codes, char* size'' vb.) dizgenin kopyasını ve büyüklüğü kaydedermiş...
  • Sonraki satırda, bir yerel değişkene iki işlevden dönen veri kayıt ediliyor: (''auto parsed = proccess(lexy());''), içten başlarsak
    ** lexy() işlevinin isminden kolaylıkla bunun Lexer sınıfı içinde olduğunu anlıyoruz,
    ** proccess()'de orada zannediyorum ama o da Parser sınıfı içinde çıkıyor...
    ** Buradan, Lexer'ın işlediği verinin Token[]'lar yoluyla Parser'a verildiğini anlıyor, peki execParser() desek nasıl olur?
  • lexy() işlevin yine yerel bir değişken ile işlenecek verinin kopyası alınıyor: (''auto c = codes.ptr;'')
  • İşlenen veri (sanırım?) bir daha işlenmek üzere proccess(Token[] tokens) içinde Parser'ın yereline kopyalanıyor...
    ** Bunu karışıklığa sebep olabilecek şekilde yine aynı isimle yapıyoruz: (''this.tokens = tokens;'')
    ** Ayrıca sonucu döndürmek için dönüş türünde boş bir yerel dizi kuruyoruz: (''Token[] result;'')
    ** Bir de ''auto startList = [];'' var ama kullanımıyor sanırım?
  • Sonra sınıfın i isimli bir üyesi vasıtasıyla veri işleniyor:
:	:	:
	for(i=0;i<tokens.length;){
		result ~= calcIt(getIt(tokens[i]));
	}
	return result;
}
  • Acaba buradaki** tokens[]** yerel kopya mı yoksa sınıfın üyesi mi onu bilmiyoruz; buna derleyici karar veriyor...
  • getIt() işlevi sadece şunu yapıyor ve bence çok kaynak tüketiyor:
Token getIt(Token token){
	if(token.typ in getItFunctions) {
		return getItFunctions[token.typ](token);
	}
	i++;
	return token;
}

.
** Yani duruma göre i değişkenini arttırarak **calcIt()'**e döndürüyor veya artırmadan olduğu gibi veri dolaşıyor...
** Belki buradan başlayarak bir sadeleştirme çalışmasını başlatabiliriz, ne dersin?

Özetle, verinin akışı ve isimlerin kısalığı biraz düzene sokulması gerekiyor. Eğer hız istiyorsak bir çok şeyi tek bir yerde halledip gereksiz değişkenlerden uzak durmalıyız.

Başarılar...

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

February 23, 2013

Ayrıca kodu optimize ederken bir stack yapısı kurmalıyız. Çünkü diziye doğrudan yapılan bu erişimleri hiç güvenli bulmuyorum. Üstelik çok çok kafa karıştırıcı. Çalışsa da ileride çıkan sorunlarda (-ki çıktı herhalde) sen bile üstesinden gelemeyebilirsin...

Sanki önceki hali güzeldi ve üzerine bina edilen şeyler sadece çalışmasına odaklanarak üretilmiş. Bence sabırla ve ilerisini düşünerek (kod henüz çalışmasa veya yavaş olsa bile) sağlam katlar çıkmalıyız. An itibariyle yıkılmak üzere olan bir bina görüyorum...

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

February 23, 2013

Son olarak aşağıdaki getItFunctions dizisine bir alternatif bulmamız lazım. Önerim aynı değerleri (delegate ve enum) alan bir stack kurmak. Hatta bu şişen bir diziyse temsilci kullanımını iptal etmeliyiz. Bu temsilciler çok kaynak tüketiyormuş. Keza çağrışımsal dizinin kendisi de kaynak tüketiyor...

import std.conv;
class Parser : Lexer{
	private:
	int i;
	Token[] tokens;
	ushort[lx] opLevels;
	Token delegate (Token) [lx] getItFunctions;
:	:	:

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

February 23, 2013

Alıntı:

>

İstersen kodu bozuk haliyle github'a koy öyle bakalım.

Şu an birşeyler yapıp (sorun neden düzeldi en ufak fikrim yok zaten neden sorun çıkmıştı onu da anlayamadım ya) çalıştırabildim. Adres yükleme işlevi ile interpret i birleştirdim. Class içinde tanımlıyordum bazı değişkenleri şimdi direk işlev içinde tanımlayınca daha hızlı oldu.

Meğer load() Lexer sınıfı içindeymiş o yüzden isminin loadLexer() olmasını öneriyorum?

Şöyle bir şey daha olacak yalnız. loadFile diye de birşey ekleyeceğiz bu da txt deki kodu ekleyecek. Bu da loadFileLexer mı olacak?

Alıntı:

>
  • lexy() işlevin yine yerel bir değişken ile işlenecek verinin kopyası alınıyor: (auto c = codes.ptr;)

Aslında kopyasını değil dizideki ilk elemanın adresini almak istedim.

[0]

yerine .ptr yaptım.

Alıntı:

>
  • İşlenen veri (sanırım?) bir daha işlenmek üzere proccess(Token[] tokens) içinde Parser'ın yereline kopyalanıyor...
    Bunu karışıklığa sebep olabilecek şekilde yine aynı isimle yapıyoruz: (this.tokens = tokens;)

Lexer daki tokenlerle artık işimiz kalmadı. O yüzden aynı isimde kaydettim. Verilerin yorumlanmış hali var ki eski halini kim napsın :)

Alıntı:

>

Bir de auto startList = []; var ama kullanımıyor sanırım?

Onun orada ne aradığı hakkında en ufak bir fikrim yok :)

Alıntı:

>

Özetle, verinin akışı ve isimlerin kısalığı biraz düzene sokulması gerekiyor. Eğer hız istiyorsak bir çok şeyi tek bir yerde halledip gereksiz değişkenlerden uzak durmalıyız.

Bana uyar :) Parser olduğu için hız konusunda çok üstünde durmadım daha çok VM nin hızı üzerinde durdum.

Alıntı:

>

Ayrıca kodu optimize ederken bir stack yapısı kurmalıyız. Çünkü diziye doğrudan yapılan bu erişimleri hiç güvenli bulmuyorum. Üstelik çok çok kafa karıştırıcı. Çalışsa da ileride çıkan sorunlarda (-ki çıktı herhalde) sen bile üstesinden gelemeyebilirsin...

Stack yapısı derken neyi kast ediyorsunuz? Çıkan hatanın sebebi diziler değildi. Ama diziler hata veriyordu :D (çok ilginç değil mi) Her ne yaptıysam düzeldi ama :)

Alıntı:

>

Son olarak aşağıdaki getItFunctions dizisine bir alternatif bulmamız lazım. Önerim aynı değerleri (delegate ve enum) alan bir stack kurmak. Hatta bu şişen bir diziyse temsilci kullanımını iptal etmeliyiz. Bu temsilciler çok kaynak tüketiyormuş. Keza çağrışımsal dizinin kendisi de kaynak tüketiyor...

Hocam templateleri kullansak daha mantıklı olmaz mı?

Zekeriya

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

February 23, 2013

Sen olayın ortasında olduğun için herşey sana çok açık görünüyor ama benim bulunduğum yerden bakınca hiçbir şey anlaşılmıyor. :) Hatayı söylemesen bile en azından derleme hatası mı yoksa çalışma zamanı hatası mı olduğunu söylesen. (Ama hata mesajını vermemen için de bir neden yok herhalde, değil mi?)

Söylediklerinden optimizasyon yapıldığı için performans kaybı oluyor gibi bir anlam çıkartıyorum. Çelişkili. :)

Bu durumu küçücük bir programla gösterebilir misin?

Ali

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

« First   ‹ Prev
1 2 3 4 5 6