feat: HTTP registry, app/bench harnesses, and DWARF #line maps
Ship QUALITY_PLAN sessions 31–33: fetchable package index URLs, showcase app and micro/nexus benchmarks, and debugger-friendly C codegen. - Registry: BUX_REGISTRY accepts http(s) URLs (curl/wget → ~/.bux/cache) - E.2: make test-apps smoke for nexus/boko/simpledb/jwt-pitbul - E.5: benches/micro + C/Nim/Zig twins; make bench-nexus (wrk) - E.4: HIR locs → #line .bux; default -O0 -g; --release -O2; make test-dwarf
This commit is contained in:
@@ -0,0 +1,8 @@
|
||||
[Package]
|
||||
Name = "micro"
|
||||
Version = "0.1.0"
|
||||
Type = "bin"
|
||||
Description = "Micro-benchmarks for Bux (E.5)"
|
||||
|
||||
[Build]
|
||||
Output = "Bin"
|
||||
@@ -0,0 +1,104 @@
|
||||
// Micro-benchmarks (E.5) — recursive fib, string concat, array push.
|
||||
// Prints lines: BENCH name iters total_us us_per_op
|
||||
import Std::Io::{PrintLine, Print};
|
||||
import Std::Time::{Time_NowUs};
|
||||
import Std::String::{String_FromInt, String_Concat, String_Len};
|
||||
import Std::Array::{Array, Array_New, Array_Push, Array_Len, Array_Get};
|
||||
|
||||
func Fib(n: int) -> int {
|
||||
if n <= 1 {
|
||||
return n;
|
||||
}
|
||||
return Fib(n - 1) + Fib(n - 2);
|
||||
}
|
||||
|
||||
func Report(name: String, iters: int, usTotal: int64) {
|
||||
var perOpUs: int64 = 0;
|
||||
if iters > 0 {
|
||||
perOpUs = usTotal / (iters as int64);
|
||||
}
|
||||
Print("BENCH ");
|
||||
Print(name);
|
||||
Print(" iters=");
|
||||
Print(String_FromInt(iters as int64));
|
||||
Print(" total_us=");
|
||||
Print(String_FromInt(usTotal));
|
||||
Print(" us_per_op=");
|
||||
PrintLine(String_FromInt(perOpUs));
|
||||
}
|
||||
|
||||
func BenchIntLoop() {
|
||||
let iters: int = 1000000;
|
||||
var acc: int = 0;
|
||||
var i: int = 0;
|
||||
let t0: int64 = Time_NowUs();
|
||||
while i < iters {
|
||||
acc = acc + i * 3 - 1;
|
||||
i = i + 1;
|
||||
}
|
||||
let t1: int64 = Time_NowUs();
|
||||
if acc == 0 && iters > 0 {
|
||||
PrintLine("unreachable");
|
||||
}
|
||||
Report("int_loop", iters, t1 - t0);
|
||||
}
|
||||
|
||||
func BenchFib() {
|
||||
discard Fib(20);
|
||||
let n: int = 30;
|
||||
let t0: int64 = Time_NowUs();
|
||||
let r: int = Fib(n);
|
||||
let t1: int64 = Time_NowUs();
|
||||
if r < 0 {
|
||||
PrintLine("unreachable");
|
||||
}
|
||||
Report("fib30", 1, t1 - t0);
|
||||
}
|
||||
|
||||
func BenchStringConcat() {
|
||||
let iters: int = 50000;
|
||||
var i: int = 0;
|
||||
let t0: int64 = Time_NowUs();
|
||||
var s: String = "";
|
||||
while i < iters {
|
||||
s = String_Concat(s, "x");
|
||||
if String_Len(s) > 256 {
|
||||
s = "x";
|
||||
}
|
||||
i = i + 1;
|
||||
}
|
||||
let t1: int64 = Time_NowUs();
|
||||
if String_Len(s) < 0 {
|
||||
PrintLine("unreachable");
|
||||
}
|
||||
Report("string_concat", iters, t1 - t0);
|
||||
}
|
||||
|
||||
func BenchArrayPush() {
|
||||
let iters: int = 100000;
|
||||
var arr: Array<int> = Array_New<int>(16);
|
||||
var i: int = 0;
|
||||
let t0: int64 = Time_NowUs();
|
||||
while i < iters {
|
||||
Array_Push<int>(&arr, i);
|
||||
i = i + 1;
|
||||
}
|
||||
let t1: int64 = Time_NowUs();
|
||||
let n: uint = Array_Len<int>(&arr);
|
||||
if n as int != iters {
|
||||
Print("array len mismatch: ");
|
||||
PrintLine(String_FromInt(n as int64));
|
||||
}
|
||||
discard Array_Get<int>(&arr, (iters - 1) as uint);
|
||||
Report("array_push", iters, t1 - t0);
|
||||
}
|
||||
|
||||
func Main() -> int {
|
||||
PrintLine("=== Bux micro-benchmarks (E.5) ===");
|
||||
BenchIntLoop();
|
||||
BenchFib();
|
||||
BenchStringConcat();
|
||||
BenchArrayPush();
|
||||
PrintLine("=== done ===");
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user