Forum: Projeler Rhodeus Script RSS
Nesneyi hafızada tutarak hız kazandırma
Sayfa:  1  2  sonraki 
Avatar
zekeriyadurmus #1
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Nesneyi hafızada tutarak hız kazandırma
Yine başlığım çok saçma oldu :)

Aşağıdaki kodun çalışma süresi 240ms.
i=0; while(i<1000000){a=1 * 1 ;i++}

Burada a değişkenindeki RhInt nesnesini yeni veri yazıldığı için intarr adındaki bir int dizisine attım. Ve çarpma işlemi yapılırken yeni bir nesne oluşturmak yerine intarr daki nesneyi aldım ve 240ms den 74 ms e indi süre.

Herhangi bir işlem yapmadan döngünün çalışma süresi ise 26ms (bu biraz daha artacak zamanla :) )
i=0; while(i<1000000){i++}

Bunu bu şekilde yapmakta bir sıkıntı yok gibi ama benzer işlemi 2 + 2 + 2 gibi geçiçi oluşturulan bu veriler üzerinde de yapmak gerek ama sistemi yavaşlatmadan yapabileceğim bir çözüm bulamadım :)

Zekeriya
Bilgi meraktan gelir...
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4428 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
zekeriyadurmus:
çarpma işlemi yapılırken yeni bir nesne oluşturmak yerine intarr daki nesneyi aldım

1 * 1 ifadesinin geçici sonucunun yalnızca a'ya atanmak için hesaplandığını gördün ve o yüzden o ifadenin değerini tutmak için ayrı bir değişken kullanmadın. (Tabii değişken diyorum ama 1*1 hesabı aslında bir yazmaçta duruyordur.) Bu çok temel bir derleyici eniyileştirmesi gibi görünüyor.

benzer işlemi 2 + 2 + 2 gibi geçiçi oluşturulan bu veriler üzerinde de yapmak gerek ama sistemi yavaşlatmadan yapabileceğim bir çözüm bulamadım

Eğer + işlemi bir ifade ise (öyle), o ifadenin değeri hesaplanmalı ve bir sonraki işlemde kullanılmalı. En hızlısı ifadeleri yazmaçlarda yaşatmak ve ancak kalıcı olacaklarsa belleğe yazmaktır.

Bunlar derleyici teknolojileri. Ben bilmem. Sana kolay gelsin. ;)

Ali
Avatar
zekeriyadurmus #3
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Hocam haklısınız lakin dilde her şey bir nesne :)

Yani 2 + 3 denildiğinde 2 nesnesinin opAdd fonksiyonu çağırılıp 3 nesnesi gönderiliyor ve çıkan sonuç fonksiyon tarafından geri döndürülüyor ve şekilde işlenmeye devam ediyor :)

Zekeriya
Bilgi meraktan gelir...
Avatar
zekeriyadurmus #4
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Hocam söylediğiniz şey ilham verdi ve şöyle bir şey yaptım.

Matematiksel işlemler için hafızada yer açtım ve bütün işlemlerimi o ilk başta oluşturduğum rhint üzerinden yaptım.
Yani 1 + 2 + 3 + 4 + 5 gibi uzayan bir ifadede hiç nesne oluşturulmuyor işlem bitiminde bir sayıya eşitleneceği zaman ise bir RhInt oluşturuyorum değerini de ilk başta oluşturduğum RhInt ten alıyor kısaca kopyalıyorum bu sayede oldukça hızlı bir yapı elde ediyoruz.

Tabi dilde bu işlemleri yavaşlatan birşeyler var anlayamadığım onları da çözdüğüm takdirde daha da hızlanacağını düşünüyorum (Hız hız diye kafayı yiyeceğim ve yiyorum :) )

i=0; while(i<1000000){a=1 + 1 + 1 + 1 + 1;i++}
134ms

i=0; while(i<1000000){a=1 + 1 + 1 + 1;i++}
115ms

i=0; while(i<1000000){a=1 + 1 + 1;i++}
101ms

i=0; while(i<1000000){a=1 + 1 ;i++}
91ms

i=0; while(i<1000000){a=1;i++}
70ms

i=0; while(i<1000000){a="talha";i++}
52ms

Ama stringin süresine bakarsanız yaptığım bu işlemler yaklaşık 20ms kadar sistemi etkiliyor yani hala eksik olan bir şeyler var

Zekeriya
Bilgi meraktan gelir...
agora #5
Üye Tem 2013 tarihinden beri · 221 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanilmiyorsam database islemleri yapilabiliyordu.

Peki ayni anda ornegin 1 milyon sorgu yapacak bi simulator yapilabilir mi?

Ya da soyle diyeyim veritabani islemlerinde islemi yapan veritabani sunucusu mu yoksa rh sunucusu mu olacak?

veritabani islemleri yine o dilin hiz sorunu olabilir mi?
Avatar
zekeriyadurmus #6
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Veritabanı bağlantı işlemlerinde dilin hıza bir etkisi olmaz ama veritabanından çekilen bilgilerin dilin kendi veri türlerine çevirilmesi aşamasında hız kaybı yaşanır. Diller için özelleştirilmiş veritabanı kütüphaneleri ile bu süre azaltılabilir.

Mesela ddilinde Variant lara çevirliyor mysql verileri. Ben uyguladığım takdirde Variantlardan peek yoluyla kendi nesnelerime çeviririm ama bu da hız kaybı olur onun yerine ilk aşamada variant oluşturmak yerine kendi nesnelerime çevirirsem bu hız kaybı yaşanmaz ve iyi bir yöntemle de hafızadan yer ayırtma işlemleri yapıldığı takdirde tadından yenmez :)

Zekeriya
Bilgi meraktan gelir...
Avatar
huseyin #7
Üye Haz 2012 tarihinden beri · 355 mesaj · Konum: Isparta
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
zekeriyadurmus:
Mesela ddilinde Variant lara çevirliyor mysql verileri. Ben uyguladığım takdirde Variantlardan peek yoluyla kendi nesnelerime çeviririm ama bu da hız kaybı olur onun yerine ilk aşamada variant oluşturmak yerine kendi nesnelerime çevirirsem bu hız kaybı yaşanmaz ve iyi bir yöntemle de hafızadan yer ayırtma işlemleri yapıldığı takdirde tadından yenmez :)

Zekeriya

eVET
En azından mysql kütüphanesinden başlanması gerekiyor dediğin doğru :) eğer yapabilirsek bu çok işimize yarar php nin mysql ile olan ilişkisi gibi bizim de rhs ile mysql arasında olan ilişkiyi artırmamız gerekir. Belki bu bize kullanıcı kazanma yolunda önemli bir gelişme sağlayabilir
Huseyin
Avatar
zekeriyadurmus #8
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Elbette güzel olur ama 1 tane Talha var :)

Zekeriya
Bilgi meraktan gelir...
Avatar
Salih Dinçer #9
Üye Ock 2012 tarihinden beri · 1890 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #4
Bu örnekler bana çift derinlikli şu gereksiz D kodlamasını anımsattı:
void main() {
  for(int i = 1; i < 10; i++) {
    int n = i; int t = n;
    while(n--) t += 1;
    /* t = 2, 4, 6, 8 ... 18
     *
     * for(int t = 2; t < 20; t+=2) { }
     */
  }
}
Görüldüğü gibi çift döngü ile yapılan bu gereksiz ve karışık kod aslında 18'e kadar çift sayıları saymakta. Oysa bunu tek bir döngü ile 20'ye kadar sayarak da halledebiliyoruz...:)

zekeriyadurmus:
... çözdüğüm takdirde daha da hızlanacağını düşünüyorum (Hız hız diye kafayı yiyeceğim ve yiyorum :) )

i=0; while(i<1000000){a=1 + 1 + 1 + 1 + 1;i++}
134ms

i=0; while(i<1000000){a=1 + 1 + 1 + 1;i++}
115ms

...
Bence, yaptığın şeyin hızını ölçmek için bu ve benzer olasılıkları düşünmene gerek yok. Yoksa hızı yavaşlatabilecek çok farlı olasılıklar da düşünülebilir. Öyleyse bu dili kullananın sorunudur. Yani neyin daha hızlı olduğunu görüp ona yönelebilir. Eğer tüm olasılıklara göre hızlı olabilecek bir dil yapmaya kalkarsan, toplamda bir yavaşlık olabileceği gibi işler bir yerden sonra Arap saçına dönebilir...:)

Hatırlarsan farklı durumlar için "mode" önerim vardı. Örneğin bunu matematiksel işlemlerin çok daha hızlı çalıştığı bir şekle (daha sonra) çevirebilirsin. Anahtar sözcüğü ise "mathops" olur mesela. Yorumlayıcı başlangıçta bunu gördüğünde kişilik değiştirip o hizmete yönelik davranmaya başlar. Bence bunlar (mod'lar) dil tam oturduğunda düşünülecek iyileştirmeler; hatta renk katacak şeyler. Yani asıl yapıyı bozmadan alternatif şeyler geliştireceksin. Böylece geriye doğru mükemmel bir uyumluluk meydana getirebilirsin.
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
agora #10
Üye Tem 2013 tarihinden beri · 221 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #6
zekeriyadurmus:
Veritabanı bağlantı işlemlerinde dilin hıza bir etkisi olmaz ama veritabanından çekilen bilgilerin dilin kendi veri türlerine çevirilmesi aşamasında hız kaybı yaşanır. Diller için özelleştirilmiş veritabanı kütüphaneleri ile bu süre azaltılabilir.

Mesela ddilinde Variant lara çevirliyor mysql verileri. Ben uyguladığım takdirde Variantlardan peek yoluyla kendi nesnelerime çeviririm ama bu da hız kaybı olur onun yerine ilk aşamada variant oluşturmak yerine kendi nesnelerime çevirirsem bu hız kaybı yaşanmaz ve iyi bir yöntemle de hafızadan yer ayırtma işlemleri yapıldığı takdirde tadından yenmez :)

Zekeriya

İşte demek istediğim buydu. Sorgulama işlemleri her ne kadar veritabanında yapılıyor olsa da kullanıcıya bu veriler gösterilirken bi tür dönüşümü yaşıyor. Bunun da çözümü hafızadan ayrılan yerde tabii yöntem olarak da iyinin seçilmesi gerekmekte :)

MySQL için D kutuphanesi vardi sanirim oyle hatirliyorum :) github uzerinde gormustum. Bunlardan mi fayda ediyorsun testlerde yoksa MS-SQL vs. denemelerin olur mu?
Avatar
zekeriyadurmus #11
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Bence, yaptığın şeyin hızını ölçmek için bu ve benzer olasılıkları düşünmene gerek yok. Yoksa hızı yavaşlatabilecek çok farlı olasılıklar da düşünülebilir. Öyleyse bu dili kullananın sorunudur. Yani neyin daha hızlı olduğunu görüp ona yönelebilir. Eğer tüm olasılıklara göre hızlı olabilecek bir dil yapmaya kalkarsan, toplamda bir yavaşlık olabileceği gibi işler bir yerden sonra Arap saçına dönebilir...:)
Hocam burada sadece 4 kere nesne oluşturmak ne kadar vakit alıyor onu hesaplatıyordum aslında :) Yoksa her ihtimal için yapmayacağım elbette nesne oluşturma süreleri bir dil için çok önemli ne kadar kısa o kadar iyi.

Hatırlarsan farklı durumlar için "mode" önerim vardı. Örneğin bunu matematiksel işlemlerin çok daha hızlı çalıştığı bir şekle (daha sonra) çevirebilirsin. Anahtar sözcüğü ise "mathops" olur mesela. Yorumlayıcı başlangıçta bunu gördüğünde kişilik değiştirip o hizmete yönelik davranmaya başlar. Bence bunlar (mod'lar) dil tam oturduğunda düşünülecek iyileştirmeler; hatta renk katacak şeyler. Yani asıl yapıyı bozmadan alternatif şeyler geliştireceksin. Böylece geriye doğru mükemmel bir uyumluluk meydana getirebilirsin.
Mod fikri gayet güzel ama ben hala uygulanabilirliği konusunda emin değilim açıkçası :)

MySQL için D kutuphanesi vardi sanirim oyle hatirliyorum :) github uzerinde gormustum. Bunlardan mi fayda ediyorsun testlerde yoksa MS-SQL vs. denemelerin olur mu?
İkinci dediğinizi analamadım ama evet D kütüphanesi var ama hatalı çalışıyordu son sürümü şu an nasıl bilmiyorum. Onları dile port edip kullanıyorum.

Zekeriya
Bilgi meraktan gelir...
Avatar
Salih Dinçer #12
Üye Ock 2012 tarihinden beri · 1890 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
zekeriyadurmus:
Mod fikri gayet güzel ama ben hala uygulanabilirliği konusunda emin değilim açıkçası :)
Bu sefer farklı bir şekilde açıklayayım:

Farz edelim elinde 2 farklı parser ve lexer sınıfın olsun. Bakın şuna ki biri önceki sürüm ve desteklediği şeyler kısıtlı, diğeri ise yeni geliştirilen ama desteklediği özellikler fazla olduğu için biraz yavaş kalana yeni sürüm. O yüzden onu kullanmak için önbellekli ve biraz daha basite indirgenmiş bir yapıya geçmek gerekiyor...

Elimizde hepimizin bildiği gibi melez (hybrid) bir yapı (xHTML) var diyelim. Ayrıca yoğun kod üretecek kısımlarını, programcının işini kolaylaştırmak için farklı bir moda geçirebileceğimiz bir bölümü olduğunu varsayalım:
<html>
  <head>
    <title> <| print(mainTitle) |> </title>
  </head>
  <body>
<!-- ************ MENU YÜKLE ************ -->
  <| vt = mySqlConnect("mainTitle", "test", "test") |>
    <div id="navmenu1">
      <ul><! vt.load("anamenu")
        line = vt.tableLength
        ilkmenu = true
        while(line) { |>
                <li><a href="<| print(vt.get("url") |>" title="<| print(vt.get("title") |>"<|
                if(ilkmenu) {
                  print(" class=\"current\"")
                  ilkmenu = false
                }|>><span><| print(vt.get("title") |></span></a></li>
                <|
                vt.next
                line-- 
        }|>
      </ul>
    </div>
<!-- ************ ÖZEL UYGULAMA YÜKLE ************ -->
    <div id="mainpage">
      <| #MODE="extremlyFast"
 
        cachedResources {
          scene("640", "480", "Test Application", "#C0C0C0") {
            test = vt.load("testapp")
            scene.form(0x20, "Search Bar", "center", test)
            scene.dataGrid(0x40, "400", "400")
            scene.slider(0x10, "List Length", "center")
            scene.run("0x20->0x10->0x40")
          }
        }
      |>
    </div>
  </body>
</html>
Yukarıdaki kod tamamen hayali, o yüzden hatalı olabilir. Öyle aklıma geldiği gibi yazdım. Mutlaka daha iyisi yapılabilir ama demek istediğim anlaşılmıştır sanırım. Dikkat ederseniz veritabanından veri alan iki güncel uygulama örnek verdim...

Bunlardan ilki hepimizin bir döngü ve CSS ile yaptığımız <ul /> için <il> satırları. Yani çok standart ve neredeyse her sitede olan bir menü yapısı. Ama farkettiyseniz hazır bir form değil ve siz HTML'e uygun bir şekilde aralara RhS kodu eklemeniz gerekiyor. Tabi başka kötü teknikler de var, örneğin tüm HTML kodu veritabanına atmak gibi.

Sonraki uygulama ise basit bir arama ve listeleme kutusunun bulunduğu bir sahne oluşturuyoruz. Buradaki kodlar tıpkı Java gibi standart bir yapı döndürdüğü yine HTML olduğunu düşünün. Yaptığı ise bir form oluşturup Ajax kullanarak sayfa içi yükleme yapmak. Yani programcıyı hiç bir kodlama ile meşgul etmeyecek. Sadece belli nesneleri tanımlayıp son satırda birbirine bağlaması gerekiyor. Buna göre veri 0x20 kimlik numaralı nesneden alınıyor ve slider (0x10)'ın belirlediği sınırlar dahilinde sonuçlar dataGrid (0x40)'a aktarılıyor...:)

Ancak dikkat burada standart print, while gibi hiç bir komut çalışmıyor. Yani yorumlayıcımız oldukça hızlı bir kipe (#MODE="extremlyFast") sokuluyor. Buna ister plug-in deyiverin, isterseniz template, isterseniz de mode.

İşte böyle...:)
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
zekeriyadurmus #13
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Öncelikle bu güzel yazı için çok teşekkür ederim Salih hocam :) Demek istediğinizi şimdi daha iyi anladım. Şimdi buna da benim bir önerim olacak :)

#MODE="extremlyFast" demek yerine

extremlyFast{

}

şeklinde bir kullanım ile yapsak bence çok daha iyi olur (hız açısından diyorum) çünkü sistem başlangıcında #mode araması yapmamız gerek ve bu da yavaşlatır diye düşünüyorum onun yerine extremlyFast demek daha hızlı olacaktır :)

Bunun için baştan bir Lexer yapmaya da gerek yok parser'a ufak bir eklemeyle çok rahat yapılabilir. Hatta bu cachedResources gibi isimlerle modüller oluşturulabilir bu işlemler doğrudan o modüllere devredilebilir.

Ve bence bu sistemi mutlaka yapmalıyız çünkü profesyonel kullanıcılar makarna kod yazmak istemiyor. HTML e bulaşmak istemiyor onun yerine bu şekilde kullanmak çok güzel olacaktır.

Zekeriya
Bilgi meraktan gelir...
Avatar
Salih Dinçer #14
Üye Ock 2012 tarihinden beri · 1890 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Evet, bu daha da mantıklı. Sonuçta biz programcılar kümeleme mantığına alışığız...

Elbette işlemlerin mutfağında olan biteni sen daha iyi bilirsin ama tek satırda kipler arası (modes) geçiş de sempatik görünüyor. Hatta herhangi bir dilde (yorumlayıcı da olabilir) böyle bir şey var mı açıkcası merak ediyorum...:)

Düşünsenize...
#mode : "OpenGL"
 
(require sgl/gl
         sgl/gl-vectors)
(glBegin GL_TRIANGLES)
(glVertex3i 1 2 3)
(glVertex4fv (gl-float-vector 1 2 3 4))
(glEnd)
dediniz ve hemen arkasından, alıştığınız D kodlarıyla devam etmek istediniz:
#mode : "ClasicD"
 
bool isRunning = true;
auto display = new Display();
scope(exit) display.cleanup();
 
while(isRunning) {
  isRunning = display.event();
  display.clear();
  display.drawGLFrame();
}
şeklinde bitirdiniz. Çok mu saçma oldu ya da yorumlayıcının sapıtmasına ve işlerin karışmasına mı sebep olur?
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
zekeriyadurmus #15
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Hocam açıkçası mode işini kümeleme ile yapma taraftarıyım bu şekilde nasıl yapacağımı hiç bilmiyorum :)

Ama dilde tabiki lisp ve c sentaksındaki değişim kadar köklü bir şey yaparsak çok büyük bir karışıklık çıkar diye düşünüyorum. Phobos ve tango cular gibi :)

Ama önceki postta dediğiniz çok mantıklı ve mutlaka uygulamalıyız diye düşünüyorum. Bunun için bir standart ayarlamak ve bir kütüphane yazmak gerek.

Zekeriya
Bilgi meraktan gelir...
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:
Sayfa:  1  2  sonraki 
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-07-21, 21:43:04 (UTC -07:00)