Eratosthenes eleği
C++'tan 1,31 kat hızlı500.000'e kadar asallar · liste erişimi. Çubuk uzunsa daha hızlı.
Liste ve dizi
500.000'e kadar asal sayılar Eratosthenes eleğiyle bulunur ve sayılır. Büyük bir listede ardışık ve atlamalı okuma/yazmayı ölçer.
Bu sayfayı KabaLang ile yazılmış sunucu sundu.
Canlı ölçüm
Eratosthenes eleği 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.
500.000'e kadar asallar · liste erişimi. Çubuk uzunsa daha hızlı.
| Dil | En iyi | Ortalama | Derleme | İkili boyutu |
|---|---|---|---|---|
| KabaLang | 0,89 ms | 0,96 ms | 687 ms | 987 KB |
| C++ | 1,2 ms | 1,4 ms | 288 ms | 16 KB |
| Python | 46,3 ms | 50,0 ms | – | – |
Ne ölçüyor?
Kategori: Liste ve dizi. Liste okuma/yazma, dizinleme ve sınır denetimi. Üç program da aynı algoritmayı aynı adımlarla uygular ve aynı çıktıyı üretmek zorundadır; çıktı tutmazsa ölçüm geçersiz sayılır.
41538Derleme
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.
n = 500000
elek = [dogru] * (n + 1)
elek[0] = yanlis
elek[1] = yanlis
p = 2
iken p * p <= n:
eger elek[p]:
k = p * p
iken k <= n:
elek[k] = yanlis
k = k + p
p = p + 1
asal_sayisi = 0
dongu x icinde elek:
eger x:
asal_sayisi = asal_sayisi + 1
yazdir(asal_sayisi)#include <iostream>
#include <vector>
int main() {
int n = 500000;
std::vector<char> elek(n + 1, 1);
elek[0] = elek[1] = 0;
for (int p = 2; p * p <= n; ++p) {
if (elek[p]) {
for (int k = p * p; k <= n; k += p) {
elek[k] = 0;
}
}
}
int asal_sayisi = 0;
for (int i = 0; i <= n; ++i) {
asal_sayisi += elek[i];
}
std::cout << asal_sayisi << std::endl;
return 0;
}n = 500000
elek = [1] * (n + 1)
elek[0] = elek[1] = 0
p = 2
while p * p <= n:
if elek[p]:
for k in range(p * p, n + 1, p):
elek[k] = 0
p += 1
print(sum(elek))export default function program(yaz = console.log) {
const n = 500000;
const elek = new Uint8Array(n + 1).fill(1);
elek[0] = elek[1] = 0;
for (let p = 2; p * p <= n; p++) {
if (elek[p]) {
for (let k = p * p; k <= n; k += p) elek[k] = 0;
}
}
let asalSayisi = 0;
for (let i = 0; i <= n; i++) asalSayisi += elek[i];
yaz(asalSayisi);
}
// `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();