Ali hocam dersiniz Hızır gibi yetişti vallahi :)
Burada da yazayım belki benim gibi ihtiyacı olan birileri çıkar :)
Ben bir nevi serialize işlemi yaptığım için bu serialize yaptığım verileri tekrardan okumam gerekiyordu. INT, char gibi bir dizi olmayan verileri çok rahat işleyebilirken dizilerde (uzunluk, ilk veri adresi) şeklinde saklandığı için bunları tekrar eski haline getirme işlemi için union kullanıyordum ve bu da vakit alıyordu.
Ama Ali hocamın da D.ershane de yazdığı gibi işleyince bir ton gereksiz koddan kurtulmuş olup hızlı bir yapı elde ettim :)
Alıntı:
> D'nin Başka Dizi Olanakları dersinde anlatmadığım bir olanağı, art arda bulunduklarından emin olunan elemanların başlangıç adresinin bir D dilimine dönüştürülebilmesidir. Böyle bir göstergeden D dilimi oluşturan söz dizimi şudur:
> elemanların_ilkini_gösteren_gösterge[0 .. eleman_adedi];
> ```
>
Yazdığım koda gelirsek eğer:
module main;
import std.stdio;
import std.datetime;
// Operandlar
enum OP : ushort{
HLT, LOAD
}
// Veri türleri
enum DT : ushort{
INT, dFunction, STRING, BOOL
}
ubyte[] veridizisi;
static class Rh{
static void newOp(in string veri){
veridizisi ~= cast(ubyte) DT.STRING;
veridizisi ~= cast(ubyte) veri.length;
veridizisi ~= cast(ubyte[]) veri;
}
static void newOp(in int veri){
veridizisi ~= cast(ubyte) DT.INT;
veridizisi ~= cast(ubyte) veri;
}
static void newOp(in ushort veri){
veridizisi ~= cast(ubyte) veri;
}
}
void*[] opcodes;
string[] opnames;
private enum next = q{adr = opcodes[*cur]; cur++; asm{jmp adr;}};
enum : ushort {REG0, REG1, REG2, REG3, REG4, REG5, REG6, REG7, REG8, REG9}
int main(string[] argv){
int leng;
long start, finish;
void* adr;
opcodes = new void*[OP.max+1];
opnames= new string[OP.max+1];
with(OP){
asm{ call op_load;} opcodes[LOAD] = adr; opnames[LOAD] = "LOAD";
asm{ call op_hlt;} opcodes[HLT] = adr;opnames[HLT] = "HLT";
}
// for(int i ; i <1_000_000;i++){
Rh.newOp(OP.LOAD);
Rh.newOp(REG0);
Rh.newOp("Zekeriya");
// }
Rh.newOp(OP.HLT);
ubyte* cur = veridizisi.ptr;
start = Clock.currAppTick().usecs();
mixin(next);
end:
writefln("Program çalışmayı bitirdi.\nGeçen süre: %s",finish - start);
//f.rawWrite(veridizisi);
// while(1){}
return 0;
op_load: asm{ call adresal; }
cur++;//register: REG0
cur++;//veri türü: 2 (String)
' writeln(cast(string) (cur+1)[0..*cur]);//Veriyi oku'
cur+=*cur + 1;//verinin uzunluğu(8) + veri uzunluğu için alan (1)
mixin(next);
op_hlt: asm{ call adresal; }
finish = Clock.currAppTick().usecs();
asm{jmp end;}
adresal: asm{
pop EBX;
mov adr[EBP],EBX;
ret;
}
}
Zekeriya
--
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]