İ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. ]