Thread overview
January 30, 2013

Merhaba call fonksiyonu ile jmp arasındaki fark nedir tam olarak?

call da ret yapıp çağırıldığı yere geri dönüyor ama bu esnada işlemcide, hafızada neler oluyor?

call işlemi yapılırken ne kadar süre geçiyor?

pop ve push işlemlerinin çalıştırılması ne kadar vakit alıyor?

call ve jmp arasındaki hız farkı nedir?

Zekeriya

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

January 30, 2013

Bu soruyu daha önce cevaplamıştım ama tekrar etmekte fayda var...

call komutu içinde gizli bir push komutu vardır. Yani bulunduğu yeri yığına kaydeder/iter. Sonra ret gördüğü yerde de işlemci en sondakini pop ile çeker alır. Aslında call ile ret birbirine çok benzer. Her ikisinde de jmp vardır ve tek fark birinde push diğerinde pop kullanılmasıdır.

Projende ise call kullanmak zorundayız. Yoksa dallanmak yetmiyor ve dallanmadan önceki yerin adresini öğrenmemiz gerekiyor...

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

January 30, 2013

Label adreslerini alarak sistemi kodladığımda daha hızlı olması gerekirken daha yavaş olduğunu fark ettim ve bunun suçunu da call fonksiyonuna atıyorum :) aslında writeln kısmından sonra ret yapmak yerine jmp yaparsam call fonksiyonunu kullanmadan bu işlemi yapabilirim. pop ve push işlemleri uzun sürüyorsa eğer bu işlem kodları baya hızlandıracaktır. Birde bu operandlardaki kontrolleri düzenlersem ciddi bir performans artışı yakalayabilirim. Şu anki hali ile diğer bütün interpreterlardan hızlı ama neden daha hızlı olmasın :)

Eğer bir gelişme olursa forumda yazarım. Eğer tamamlayabilirsem 1.0 sürümünü kaynak kodlarıyla birlikte yayınlamayı düşünüyorum. Eğer sizler için de uygunsa projeler başlığı altında interpreter için bir forum açılabilir.

Zekeriya

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

January 31, 2013

Peki bu testi adresleri edindikten sonra mı yaptın? Yoksa adresler bir diziye toplandıktan sonra test edersen switch case veya if'lere göre daha hızlı olması lazım diye düşünüyorum...

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

January 31, 2013

Testi aşağıdaki komut ile yapmıştım. Ama malesef switch case li yapıdan daha hızlı olmadı. Biraz beklentim çok ama şöyle 4-5 ms çıksa baya hızlı olacak. Aynı işlem php de 70ms sürüyor.

module main;

import std.stdio, std.datetime;
enum{
	OP_INC = 0,
	OP_VAR = 1,
	OP_CMP,
	OP_JNE,
	OP_HLT
}
void main(){
	void *pc;
	void*[] opcodes;

	asm{ call op_inc;};pc += 0x4;opcodes ~= pc;
	asm{ call op_var;};pc += 0x4;opcodes ~= pc;
	asm{ call op_cmp;};pc += 0x4;opcodes ~= pc;
	asm{ call op_jne;};pc += 0x4;opcodes ~= pc;
	asm{ call op_hlt;};pc += 0x4;opcodes ~= pc;
	int cmp;//karşılaştırma işlemin için

	int sayi, sayi_max=1_000_000;

	int cur;
	auto list = [2,0,3,4];
	auto currentTime = Clock.currTime();
	goto startlm;
startl:
	cur++;
startlm:
	pc = opcodes[list[cur]];
	asm { call pc;}
	goto startl;
	return;
	/////////////////////////////////////////////////////////7
	asm{
		call pc;
	}
	while(1){}
	return;

	//OPCODES BURAYA
	asm{
	op_inc:
		call adresal;
		mov pc[EBP], EAX;
		ret;
	}
	sayi++;
	asm{
		ret;
	op_cmp:
		call adresal;
		mov pc[EBP], EAX;
		ret;
	}
	cmp = sayi_max - sayi;
	asm{
		ret;
	op_jne:
		call adresal;
		mov pc[EBP], EAX;
		ret;
	}
	if(cmp != 0) cur = -1;
	asm{
		ret;
	op_var:
		call adresal;
		mov pc[EBP], EAX;
		ret;
	}
	asm{
		ret;
	op_hlt:
		call adresal;
		mov pc[EBP], EAX;
		ret;
	}
	auto currentTime2 = Clock.currTime();
	writeln(currentTime2-currentTime);
	writeln("kodlar çalışmayı bitirdi");
	while(1){}
	asm{
		ret;
	}

	//Adres almak için
	asm{adresal: pop EBX ; mov EAX,EBX; push EBX; ret;}
	return;
}

Php testimi aşağıdaki kodla yaptım. Araya ekstradan microtime dan dönen metini bölmek için kod yazmadım. Hız testinin daha gerçekçi olması için

<?php
$test = microtime();
for($i=0;$i<1000000;$i++){}
$test2 = microtime();
echo $test2-$test;
?>

Ve bu testler esnasında python, php den daha yavaş olduğunu öğrendim. Çok şaşırdım ama sanırım php nin önceki sürümleri çok ağırmış cache özelliği ile sayesinde bu yavaşlığı kapattığını öğrendim. Tabi bu yavaşlık 5-6 sene önceki bir yavaşlık :)

	auto c1 = Clock.currTime();
	for(int i; i<1_000_000; i++){
	}
	auto c2 = Clock.currTime();
	writeln(c2-c1);
	while(1){}
	return;

ayrıca D dilinin hızını test ettiğimizde 3ms çıkıyor. Eğer gerçeğe daha yakın bir hız yakalayabilirsem ve parse edilen kodları uygun algoritma ile işlersem optimize kodla mevcut interpreterlardan daha hızlı bir interpreter yapabilirim :)

Zekeriya

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