İkili ağaçlar
C++'tan 2,21 kat hızlıderinliği 4–17 ağaçlar, yaklaşık 900.000 düğüm · bellek ayırma. Çubuk uzunsa daha hızlı.
Bellek ayırma
Derinliği 4 ile 17 arasında değişen tam ikili ağaçlar kurulur, düğümleri sayılır ve bırakılır. Küçük nesne ayırma ve bırakma hızını, KabaLang'da referans sayımını ölçer.
Bu sayfayı KabaLang ile yazılmış sunucu sundu.
Canlı ölçüm
İkili ağaçlar tarayıcınızda, WebAssembly ile koşar: KabaLang, C++, JavaScript ve Python. Ölçüm sayfası bu testi seçili açar; sonuçlar cihazınızda kalır.
derinliği 4–17 ağaçlar, yaklaşık 900.000 düğüm · bellek ayırma. Çubuk uzunsa daha hızlı.
| Dil | En iyi | Ortalama | Derleme | İkili boyutu |
|---|---|---|---|---|
| KabaLang | 10,6 ms | 11,4 ms | 622 ms | 984 KB |
| C++ | 23,4 ms | 24,7 ms | 316 ms | 17 KB |
| Python | 75,4 ms | 76,7 ms | – | – |
Ne ölçüyor?
Kategori: Bellek ayırma. Çok sayıda küçük nesnenin ayrılması ve bırakılması. Üç program da aynı algoritmayı aynı adımlarla uygular ve aynı çıktıyı üretmek zorundadır; çıktı tutmazsa ölçüm geçersiz sayılır.
913133Derleme
kabalang derle program.kbl -o program
./programclang++ -O2 -o program program.cpp
./programpython3 program.py-O 2; program, çalışma zamanıyla
birlikte bağlama anında eniyilenir ve statik bağlanır (tek, bağımlılıksız ikili).-O2; standart kütüphaneye dinamik bağlı.Kaynak
Aşağıdaki dosyalar ölçülen programların kendisidir.
sayilabilir Agac:
Yaprak
Dal(sol: Agac, sag: Agac)
fonksiyon agac(derinlik: sayi) -> Agac:
eger derinlik == 0:
don Agac.Yaprak
don Agac.Dal(agac(derinlik - 1), agac(derinlik - 1))
fonksiyon say(a: Agac) -> sayi:
esles a:
Dal(sol, sag):
don 1 + say(sol) + say(sag)
Yaprak:
don 1
don 0
en_derin = 16
toplam = say(agac(en_derin + 1))
uzun_omurlu = agac(en_derin)
d = 4
iken d <= en_derin:
tekrar = 1 << (en_derin - d)
i = 0
iken i < tekrar:
toplam = toplam + say(agac(d))
i = i + 1
d = d + 4
toplam = toplam + say(uzun_omurlu)
yazdir(toplam)#include <iostream>
struct Dugum {
Dugum *sol, *sag;
};
Dugum *agac(int derinlik) {
if (derinlik == 0) return new Dugum{nullptr, nullptr};
return new Dugum{agac(derinlik - 1), agac(derinlik - 1)};
}
long long say(const Dugum *a) {
if (a->sol == nullptr) return 1;
return 1 + say(a->sol) + say(a->sag);
}
void sil(Dugum *a) {
if (a->sol != nullptr) {
sil(a->sol);
sil(a->sag);
}
delete a;
}
int main() {
const int en_derin = 16;
Dugum *gerilim = agac(en_derin + 1);
long long toplam = say(gerilim);
sil(gerilim);
Dugum *uzun_omurlu = agac(en_derin);
for (int d = 4; d <= en_derin; d += 4) {
int tekrar = 1 << (en_derin - d);
for (int i = 0; i < tekrar; ++i) {
Dugum *a = agac(d);
toplam += say(a);
sil(a);
}
}
toplam += say(uzun_omurlu);
sil(uzun_omurlu);
std::cout << toplam << std::endl;
return 0;
}def agac(derinlik):
if derinlik == 0:
return (None, None)
return (agac(derinlik - 1), agac(derinlik - 1))
def say(a):
sol, sag = a
if sol is None:
return 1
return 1 + say(sol) + say(sag)
en_derin = 16
toplam = say(agac(en_derin + 1))
uzun_omurlu = agac(en_derin)
d = 4
while d <= en_derin:
tekrar = 1 << (en_derin - d)
for _ in range(tekrar):
toplam += say(agac(d))
d += 4
toplam += say(uzun_omurlu)
print(toplam)// Yaprak: [null, null] · dal: [sol, sag]
function agac(derinlik) {
if (derinlik === 0) return [null, null];
return [agac(derinlik - 1), agac(derinlik - 1)];
}
function say(a) {
const [sol, sag] = a;
if (sol === null) return 1;
return 1 + say(sol) + say(sag);
}
export default function program(yaz = console.log) {
const enDerin = 16;
let toplam = say(agac(enDerin + 1));
const uzunOmurlu = agac(enDerin);
for (let d = 4; d <= enDerin; d += 4) {
const tekrar = 1 << (enDerin - d);
for (let i = 0; i < tekrar; i++) toplam += say(agac(d));
}
toplam += say(uzunOmurlu);
yaz(toplam);
}
// `node program.js` ile de koşar (tarayıcıda ölçüm işçisi program()ı çağırır).
if (globalThis.process?.argv?.[1]?.endsWith("program.js")) program();