| |
|
Salih Dinçer 
| Geçenlerde bir test yapmıştım ve ubyte veri türünde bağlı listenin 60-70 kat yavaş kaldığın hesapladım. Çünkü gösterge cambazlığında veri türünü değiştirmek çok bir şey ifade etmiyor. Ancak dizilerde en az 10 kata varan hız artışı meydana geliyor. Denemek isteyen sırasıyla ubyte, uint ve ulong arasındaki farkı aşağıdaki kodu deneyerek gözleriyle görebilirler.
/*
linkedListTest.d (27.09.2012)
*/
import std.array, std.conv;
import std.random, std.stdio;
struct DÜĞÜM {
ubyte veri;
DÜĞÜM *bağı;
this(ubyte data, DÜĞÜM *node) { veri = data; bağı = node; }
string toString() const {
string result = to!string(veri);
if(bağı) result ~= ", " ~ to!string(*bağı);
return result;
}
}
void sıralıEkle(ubyte veri, ref DÜĞÜM *bağı) {
DÜĞÜM *önceki, şimdiki = bağı;
DÜĞÜM *sonraki = new DÜĞÜM(veri, null);
while(şimdiki != null && şimdiki.veri < veri) {
önceki = şimdiki;
şimdiki = şimdiki.bağı;
}
if(önceki == null) bağı = sonraki;
else önceki.bağı = sonraki;
sonraki.bağı = şimdiki;
}
void sıralıEkle(ubyte veri, ref ubyte[] liste) {
ulong k = ikiliArama(veri, liste);
with( appender!(ubyte[]) ) {
put(liste[0..k]);
put(veri);
put(liste[k..$]);
liste = data;
}
}
ulong ikiliArama(ubyte veri, ref ubyte[] liste) {
ulong test, low;
ulong high = liste.length;
while(low + 1 < high) {
test = (low + high) / 2;
if(liste[test] > veri) {
high = test;
} else {
low = test;
}
}
return high;
}
import std.datetime;
void main(string[] args) { // 100000 (yüz bin)
int tekrar = args.length > 1 ? to!int(args[1]) : 10;
version(test) DÜĞÜM* testList;
else ubyte[] testArray;
ubyte[] rakamlar;
for(; rakamlar.length < tekrar; rakamlar ~= cast(ubyte)uniform(0, 100)) {
auto yüzde = cast(real)rakamlar.length / cast(real)tekrar;
"\r".write("Rakamlar üretiliyor: %", yüzde * 100);
}
"\n".writeln("TEST BAŞLADI...");
auto ts = Clock.currAppTick();
foreach(rakam; rakamlar) {
version(test) sıralıEkle(rakam, testList);
else sıralıEkle(rakam, testArray);
}
debug (on) {
version(test) writefln("Bağlı Liste:\n[%s]", to!string(*testList));
else writefln("Normal Dizi:\n%s", testArray);
}
writeln((Clock.currAppTick() - ts)/1000.0);
}
Notlar:
- Eğer derlerken -version=test parametresini vermezseniz normal bir dizi oluşturur.
- Hata ayıklamak ve geliştirmek için -debug=on ile ekrana listeleri yansıtabilirsiniz.
- İşlemci hızınız çok fazlaysa ./linkedListTest 100000 parametresini büyütebilirsiniz.
- Hesabı, basitçe iki derleme (test) arasındaki değeri oranayalarak yapabilirsiniz.
- En hızlı denemeyi, 100 bin sayı ve ubyte ile yaptığımda, tam 70 kat hızlı olduğunu gördüm...:)
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]
|