Jump to page: 1 2 3
Thread overview
January 02, 2013

http://ddili.org/forum/thread/1017 adresinde Salih hocamın yazmış olduğu kodlarda biraz değişiklik yaparak birşey denedim ama sistem hız konusunda sınıfta kalıyor malesef bu hız sorununu nasıl aşabiliriz?

import std.stdio;
import std.datetime;

int satir = 0;
int[string] variables;
interface Komut{
public:
   void işlet();
}
class TekliKomut : Komut{
public:
   void işlet(){
       işlet_özel();
   }
protected:
   abstract void işlet_özel();
}
class defineVar : TekliKomut{
private:
   string var;
   int val;
public:
   this(string var, int val){
       this.var = var;
       this.val = val;
   }
protected:
   override void işlet_özel(){
		variables[var] = val;
   }
}
class varInc : TekliKomut{
private:
   string dosya;
public:
   this(string dosya){
       this.dosya = dosya;
   }
protected:
   override void işlet_özel(){
		variables[dosya]+=1;
   }
}

class jmp : TekliKomut{
private:
   int dosya;
public:
   this(int dosya){
       this.dosya = dosya - 2;
   }
protected:
   override void işlet_özel(){
		satir=dosya;
   }
}

class eqJmp : TekliKomut{
private:
   int addr;
   int val;
	string var;
public:
   this(string var, int val,int addr){
       this.var = var;
       this.val = val;
       this.addr = addr - 2;
   }
protected:
   override void işlet_özel(){
		if(variables[var]==val) satir = addr;
   }
}

void f(){
}

void main(){


   Komut[] komutlar;
   komutlar ~= new defineVar("i", 0);
   komutlar ~= new varInc("i");
   komutlar ~= new eqJmp("i", 10_000_000,10);
   komutlar ~= new jmp(2);

	auto a = Clock.currSystemTick().usecs();
   while(satir<komutlar.length) {
       komutlar[satir].işlet();
		satir++;
  }
	auto b = Clock.currSystemTick().usecs();
	writeln("i = ",variables["i"]);
	writeln("--------------");
	writeln("time: ",b-a);

	while(1){}
}

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

January 02, 2013

Aslında sıkıntı class ların kullanımı ile ilgili. Bunun yerine belki struct kullanımı veya daha farklı bir yapının kullanılması sorunu çözebilir

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

January 02, 2013

Şu boş döngüyle karşılaştırıyorum:

   foreach (i; 0..10_000_000) {

   }

Senin programlama dilin boş döngüden 60 kat kadar yavaş kalıyor.

Bir kere de '-O -release -inline' seçenekleriyle deniyorum; bu sefer seninki 70 kat kadar yavaş kalıyor.

Sonuçta seninki yorumlamalı bir dil olduğu için (çünkü mikroişlemcinin diline derlemiyorsun) Python gibi diller kadar yavaş kalması normal olmalı. Şurada C ile Python'un bir karşılaştırması var:

http://benchmarksgame.alioth.debian.org/u32q/benchmark.php?test=all&lang=python3&lang2=gcc

Programına göre Python 5 ile 112 kat yavaş kalıyor. Hızlandıracak yöntemler düşünülebilir ama bence durum çok kötü değil. :)

Ali

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

January 03, 2013

PHP ye göre karşılaştırma yaptım php buradaki yapıdana 3 kat daha hızlı python ise php den 10 katdan fazla daha hızlı. Burada bence yanlış olan şey bu işlemleri class yapılarıyla yapmamız sistemi daha az yoracak bir yapı ile yapsaydık daha hızlı olurdu.

Zekeriya.

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

January 03, 2013

Cevap yazdığınız için teşekkür ederim. Test ettiğim şey basit bir işlem.

int i = 0;
while(i<10000000){
 i++;
}

burada yapılan işlem değişken tanımlama ve ile 0 dan 10000000 a kadar döngü.

PHP çok daha hızlı.

Komut sayısı artacağından sürekli bir switch case yapısı yapmak da istemiyorum açıkcası bütün işlemler doğrudan gideceği adresi bilseler çok daha iyi olurdu.

Zekeriya

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

January 03, 2013

Ali hocam biraz internette araştırırken http://byteworm.com/2010/11/21/the-fastest-vm-bytecode-interpreter/ bunu buldum ama kodlar c kodu ve c bilmiyorum malesef. Çoğu yapıyı d dilinde karşılığını yazamıyorum zaten ne kadar d biliyorsam :)

Ama sanırım buradaki mantık daha mantıklı.

Zekeriya

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

January 03, 2013

Sanırım yanlış tabir ettim. O kodu ben php de çalıştırıyorum.
Php de 0.4 saniye falan sürüyor ama o bizim classlı yapımızda aynı işlem 1 saniyeden fazla sürüyor

Zekeriya

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

January 03, 2013

http://forum.dlang.org/thread/d8kep6$24c0$1@digitaldaemon.com

adresinde birisi daha benimle aynı sorunla uğraşıyor label adresleri alınmıyor.

C ye dönüş yapacak mışım gibi görünüyor şuan :S

Zekeriya

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

January 03, 2013

Alıntı (zekeriyadurmus):

>

Burada bence yanlış olan şey bu işlemleri class yapılarıyla yapmamız

class'ın getirdiği yük, eldeki Komut'un tam olarak hangi türden Komut olduğunu belirleyerek işlet_özel() işlevini o asıl tür için işletmek. Bu işi C++'ın da uyguladığı virtual function table pointer (vtbl pointer) ile sağlıyor.

Her nesnenin içinde işlev tablosuna bir gösterge var. işlet_özel() gibi bir işlevle karşılaşıldığında önce o vtbl üzerinde o tabloya geçiliyor ve o tablo içinde işlet_özel()'e karşılık gelen gözdeki işlev göstergesinin gösterdiği asıl işlev iştetiliyor.

Görüldüğü gibi, asıl işlemden önce bir kaç tane göstergenin izlenmesi gerekiyor. Ancak, bu işlemlerin hiçbirisi gereksiz değil. Eğer tam olarak ne oldukları baştan bilinemediği için programa gömülemeyen Komut'lar varsa, bundan daha hızlı olan yöntem de yok galiba.

Alıntı:

>

sistemi daha az yoracak bir yapı ile yapsaydık daha hızlı olurdu.

Akla gelen en basit yöntemlerden birisi, class'ları bir kenara atıp her Komut içinde onun ne olduğunu belirleyen bir enum tutmak olabilir:

enum KomutTürü { defineVar, varInc, /* ... */ };

struct Komut
{
   KomutTürü tür;
   /* ... */
}

(Zaten C'de de yapılan budur.)

Ondan sonra komut işletileceği zaman o tür ya bir switch-case ile ya da if-else-if ile denetlenir ve doğru işlem öyle bulunur.

Ama ben bu son yöntemin class'tan daha iyi olduğundan emin değilim. Daha hızlı ise de on kat hızlı olacağını sanmam. Ama denemeden bilemeyiz. (Aslında bu ikinci yöntem mikroişlemci'nin daha sevdiği bir yöntem galiba çünkü class'ların kullandığı o işlev tabloları belleğin nesneden daha uzak bir yerinde bulunuyorlar. O yüzden mikroişlemcinin ara belleğinin dışında kalmış olabiliyorlar.)

Ne olursa olsun güzel bir problem. Bakalım class'tan daha hızlı bir çözüm bulabilecek miyiz; bulursak da ne kadar hızlı olacak ve kodlamayı ne kadar güçleştirmiş olacağız? Örneğin, yeni bir komutun eklenmesi ne kadar daha zor olacak?

Ali

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

January 03, 2013

Ek olarak, php veya Python programlarını da görebilir miyiz? Bu gibi karşılaştırmalarda gözden kaçan bir konu, karşılaştırılan iki programın tam olarak aynı işi yapmadıkları olabiliyor. Eğer öyleyse, D programını da tam olarak diğerinin eşdeğeri olarak yazabiliriz ve belki de D programı daha hızlı çıkar.

Ali

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

« First   ‹ Prev
1 2 3