Merhaba,
Hemen cevaplayayım sanırım değil...:)
Aslında bu sonuç göreli de olabilir. Çünkü küçük de olsa bir fark var; bunu, biraz ara verip benim için sürpriz olan duruma (neredeyse eşit sonuçlara) sebep olan hatayı bulduğumda gördüm. Meğer ulong'larda bit işlem kullanıyorsanız (koddaki maskeleme bölümünde yer alan cast(T)'ye dikkat) tür dönüşümleri yapmak gerekiyormuş.
Aşağıdaki kod, boolean verilerinin her biri, gerçekten de 1 bit yer tutan bir yığıta (stack) sahip. Bu yığıtı her seferinde aynı 1/0'lar ile yarı rasgele bir biçimde (abur cuburla!) dolduruyorum. Dilersek de kurulum sırasında veri türünü değiştirebiliyorsunuz. Eğer Linux kullanıyorsanız, time ./universalTest şeklinde çalıştırdığınızda göreceksiniz ki; işlemci hızına göre değişen ama 30 sn.'yi geçmeyen önemsiz farklar var!
Buna rağmen bu sonuç hala benim için bir sürpriz... 8-(
/*
universalTest.d (06.10.2012)
*/
class Stack(T) {
private int konum;
private T[] stack;
public:
immutable type_length = (T.sizeof * 8);
this (size_t size) {
size_t taşmaVar_mı = size % type_length ? 1 : 0;
stack = new T[(size / type_length) + taşmaVar_mı];
}
void push(bool veri) @property {
immutable index = konum / type_length;
immutable xMask = konum % type_length;
if(veri) stack[index] |= cast(T)1 << xMask;
konum++;
}
bool bitTest(size_t bit) {
T xCell = stack[bit / type_length];
T xMask = cast(T)1 << bit % type_length;/*
^----bu çok önemli çünkü
ulong'da sıkıntı yapıyor! */
return (xCell & xMask) != 0;
}
string toString() {
string sonuç = "[";
size_t n;
foreach(i; 0..(type_length * stack.length)) {
sonuç ~= bitTest(i) ? "1" : "0";
}
return sonuç ~ "]";
}
}
bool abur_cuburlaDoldur(size_t n) {
union u { uint i; float f; }
auto sayı = u(0);
sayı.f = 1/cast(float)n;
return sayı.i % 2 ? 1 : 0;
}
import std.stdio;
void main() {
immutable xAdet = uint.max;
auto test = new Stack!ubyte(xAdet); // ushort||uint||ulong
//test.writeln;
with(test) {
writefln("%d x (%d bits integer)\n%d [1/0] booleans:\n",
stack.length, type_length, xAdet);
foreach(i; 0..xAdet) {
push(abur_cuburlaDoldur(i));/*
push(cast(bool)uniform(0, 2));//*/
}
//toString.writeln;
}
}
Dip Not: Eğer sözde rasgele değerler ile yığıtı doldurmak isterseniz 1.push() satırını kapatarak altındakini açın. Ancak bu sefer algoritmanın karışıklığından dolayı test süreleri en az 2-3 kat artıyor. Zaten bize rasgelelik gerekmiyor. Hatta her iki testte aynı değerleri üreten bir işlevin olması daha iyi ölçülebilen test sonuçları elde etmemizi sağlıyor.
Başarılar...
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]