///|
/// Benchmark: Encode single WAL upsert record (dim=64)
test "bench/wal_encode_upsert_64" (b : @bench.T) {
let id = @types.VectorId::from_int(12345)
let vector = Array::make(64, 0.5)
let attrs = @types.empty_attrs()
attrs.set("name", @types.String("test"))
attrs.set("score", @types.Float(0.95))
let record = WalRecord::upsert(id, vector, attrs)
b.bench(fn() { b.keep(encode_wal_record(record).length()) })
}
///|
/// Benchmark: Decode single WAL upsert record (dim=64)
test "bench/wal_decode_upsert_64" (b : @bench.T) {
let id = @types.VectorId::from_int(12345)
let vector = Array::make(64, 0.5)
let attrs = @types.empty_attrs()
attrs.set("name", @types.String("test"))
attrs.set("score", @types.Float(0.95))
let record = WalRecord::upsert(id, vector, attrs)
let bytes = encode_wal_record(record)
b.bench(fn() {
let r = @binary.BinaryReader::new(bytes)
b.keep(decode_wal_record(r) is Some(_))
})
}
///|
/// Benchmark: Encode 100 WAL records to segment
test "bench/wal_encode_segment_100" (b : @bench.T) {
let records : Array[WalRecord] = []
for i in 0..<100 {
let id = @types.VectorId::from_int(i)
let vector = Array::make(64, i.to_double() / 100.0)
let attrs = @types.empty_attrs()
attrs.set("idx", @types.Int(i.to_int64()))
records.push(WalRecord::upsert(id, vector, attrs))
}
b.bench(fn() { b.keep(encode_wal_segment(records).length()) })
}
///|
/// Benchmark: Decode 100 WAL records from segment
test "bench/wal_decode_segment_100" (b : @bench.T) {
let records : Array[WalRecord] = []
for i in 0..<100 {
let id = @types.VectorId::from_int(i)
let vector = Array::make(64, i.to_double() / 100.0)
let attrs = @types.empty_attrs()
attrs.set("idx", @types.Int(i.to_int64()))
records.push(WalRecord::upsert(id, vector, attrs))
}
let bytes = encode_wal_segment(records)
b.bench(fn() { b.keep(decode_wal_records(bytes).length()) })
}
///|
/// Benchmark: Encode WAL remove record
test "bench/wal_encode_remove" (b : @bench.T) {
let id = @types.VectorId::from_int(999)
let record = WalRecord::remove(id)
b.bench(fn() { b.keep(encode_wal_record(record).length()) })
}
///|
/// Benchmark: WAL header encoding
test "bench/wal_encode_header" (b : @bench.T) {
b.bench(fn() { b.keep(encode_wal_header().length()) })
}
///|
/// Benchmark: WAL checksum verification
test "bench/wal_verify_checksum" (b : @bench.T) {
let records : Array[WalRecord] = []
for i in 0..<50 {
let id = @types.VectorId::from_int(i)
let vector = Array::make(32, 0.5)
records.push(WalRecord::upsert(id, vector, @types.empty_attrs()))
}
let bytes = encode_wal_segment(records)
b.bench(fn() { b.keep(verify_wal_checksum(bytes)) })
}
///|
/// Benchmark: Encode upsert with large attrs (10 fields)
test "bench/wal_encode_large_attrs" (b : @bench.T) {
let id = @types.VectorId::from_int(1)
let vector = Array::make(64, 0.5)
let attrs = @types.empty_attrs()
for i in 0..<10 {
attrs.set("field_" + i.to_string(), @types.String("value_" + i.to_string()))
}
let record = WalRecord::upsert(id, vector, attrs)
b.bench(fn() { b.keep(encode_wal_record(record).length()) })
}