Skip to content

Commit d1b9d1d

Browse files
miaobyteclaude
andcommitted
Merge branch 'master' into feat/issue-268-handle-cache
冲突:runtime/src/runtime_internal.h(master 的 clang-format 重排 + 本 PR 新增 kvspaceRef_t/三个 weak 声明/ref 表字段/kvlangKvInvalidateFrame 声明),按 master 风格保留两侧内容;runtime/src/kv.c 自动合并。 Co-Authored-By: Claude Code <noreply@anthropic.com>
2 parents bc8a4a3 + c928f43 commit d1b9d1d

172 files changed

Lines changed: 4919 additions & 2561 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/ci.yml

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,15 @@
11
name: ci
22
on: [push, pull_request, repository_dispatch]
33
jobs:
4-
build:
4+
test:
55
runs-on: ubuntu-latest
6+
name: test-${{ matrix.backend.name }}
7+
strategy:
8+
fail-fast: false
9+
matrix:
10+
backend:
11+
- { name: shm, dsn: "shm:///tmp/kvlang_ci_shm.shm" }
12+
- { name: fs, dsn: "fs:///tmp/kvlang_ci_fs" }
613
steps:
714
- uses: actions/checkout@v4
815
- name: 下载 ABI 依赖
@@ -15,6 +22,6 @@ jobs:
1522
sudo cp layout/target/release/libkvlanglayout.so /usr/lib/
1623
make runtime-rs
1724
sudo make install
18-
- name: 测试
19-
env: { KVSPACE: "shm:///tmp/kvlang_ci" }
25+
- name: 测试 (${{ matrix.backend.name }})
26+
env: { KVSPACE: "${{ matrix.backend.dsn }}" }
2027
run: python3 tutorial/test.py

benchmark/README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ kvlang 是被测对象,**分别在三个 kvspace 后端上各跑一遍,占
5656
| `k_nucleotide` | 字符串 + 哈希表 | 逐字符 `ord` 入哈希表统计碱基频次 |
5757
| `iops` | 最小寻址单元往返地板价 | 单 key 读-改-写 `a=a+1`,per-op 延迟(对齐 #204,参考基线) |
5858
| `prime_sieve` | 计算 / 控制流密集 | 嵌套 `while` + 取模,O(n²) 内层迭代(参考基线) |
59+
| `matmul_compact` | **数组物理形态**(compact) |`matmul` 算法,矩阵落单个 `[N,N]float64`(storetype=ARRAYND,元素连续打包),对照「每元素一个 key 的散 key map」 |
60+
| `quicksort_compact` | **数组物理形态**(compact) |`quicksort` 算法,待排数组与显式栈都落单个 `[N]int64`,全程在 compact 数组里直接交换 |
5961

6062
kvlang 的性能瓶颈是「PC/帧/局部全落 KV 树、每步一次往返」的架构本质(见 kvlang#194 #204 #116),
6163
不是某个热点函数;`iops`/`prime_sieve` 单独隔离出这条地板价,其余八例是跨语言等价算法对照。

benchmark/cases/binary_search/binary_search.kv

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// 建 arr[i]=i,对 0..N-1 逐个二分,累加命中下标;N 由 __SCALE__ 占位(勿改逻辑)
33
// 期望输出(N=32 时):
44
// bsearch: found = 32 sum = 496
5-
rwfunc bsearch(arr:[int64]·int64, n:int64, target:int64) -> (idx:int64) {
5+
rwfunc bsearch(arr:*[int64]·int64, n:int64, target:int64) -> (idx:int64) {
66
0 -> lo
77
n - 1 -> hi
88
-1 -> idx

benchmark/cases/matmul/matmul.kv

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,30 @@
1-
// matrix multiplication benchmark — 稠密方阵乘(浮点运算 + 三重循环)
2-
// A/B 元素取 0.25 倍数(二进制精确),C 校验和 × 1e6 恒为精确整数、跨语言逐字节一致
1+
// matrix multiplication benchmark(compact 形式)— 同 matmul 算法,矩阵落**单个 compact XValue**
2+
//`[N,N]float64`,storetype=ARRAYND,元素连续打包),而非散 key 的 `[int64]·float64` map
3+
// 对比点:同一算法的两种 kv 物理形态——map 每次元素访问一次 KV 往返,compact 一次 xv·at/set
34
// 方阵阶 N 由 __SCALE__ 占位(O(N^3),勿改逻辑)
45
// 期望输出(N=6 时):
56
// matmul: check = 82750000
67
rwfunc test() -> () {
78
__SCALE__ -> n
8-
A:[int64]·float64 = {}
9-
B:[int64]·float64 = {}
9+
A:[__SCALE__,__SCALE__]float64 = []
10+
B:[__SCALE__,__SCALE__]float64 = []
1011
0 -> i
1112
while (i < n) {
1213
0 -> j
1314
while (j < n) {
14-
i × n -> base
15-
base + j -> idx
1615
i + j -> ta
1716
ta % 4 -> qa
1817
float64(qa) -> qaf
1918
qaf × 0.25 -> pa
2019
pa + 0.25 -> av
21-
av -> A·*idx
20+
av -> A[i, j]
2221
i × 2 -> i2
2322
i2 + j -> tb
2423
tb % 4 -> qb
2524
float64(qb) -> qbf
2625
qbf × 0.25 -> pb
2726
pb + 0.25 -> bv
28-
bv -> B·*idx
27+
bv -> B[i, j]
2928
j + 1 -> j
3029
}
3130
i + 1 -> i
@@ -39,12 +38,8 @@ rwfunc test() -> () {
3938
0.0 -> acc
4039
0 -> k
4140
while (k < n) {
42-
i × n -> ba
43-
ba + k -> ia
44-
kv·get(A, ia) -> av
45-
k × n -> bb
46-
bb + j -> ib
47-
kv·get(B, ib) -> bv
41+
A[i, k] -> av
42+
B[k, j] -> bv
4843
av × bv -> pr
4944
acc + pr -> acc
5045
k + 1 -> k

benchmark/cases/quicksort/quicksort.kv

Lines changed: 27 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,66 @@
1-
// quicksort benchmark — 迭代 Lomuto 分区就地排序(数组访问 + 显式栈递归)
1+
// quicksort benchmark(compact 形式)— 同 quicksort 算法,待排数组与显式栈都落**单个 compact
2+
// XValue**`[N]int64`,storetype=ARRAYND),而非散 key 的 `[int64]·int64` map
3+
// 对比点:同一算法的两种 kv 物理形态。
24
// 数据由 LCG 确定生成,规模 N 由 __SCALE__ 占位,run.py 按扫描点替换(勿改逻辑)
35
// 期望输出(N=64 时):
46
// qsort: a0 = 1 amid = 52 alast = 99
57
rwfunc test() -> () {
68
__SCALE__ -> n
7-
arr:[int64]·int64 = {}
9+
arr:[__SCALE__]int64 = []
810
1 -> seed
911
0 -> i
1012
while (i < n) {
1113
seed × 1103515245 -> s1
1214
s1 + 12345 -> s2
1315
s2 % 2147483648 -> seed
1416
seed % 100 -> v
15-
v -> arr·*i
17+
v -> arr[i]
1618
i + 1 -> i
1719
}
1820
t0 = time·now()
19-
st_lo:[int64]·int64 = {}
20-
st_hi:[int64]·int64 = {}
21+
// 显式栈也用 compact:与待排数组一样落单个 ARRAYND XValue,全程只在 compact 数组里直接交换。
22+
st_lo:[__SCALE__]int64 = []
23+
st_hi:[__SCALE__]int64 = []
2124
0 -> top
22-
0 -> st_lo·*top
23-
n - 1 -> st_hi·*top
25+
0 -> st_lo[top]
26+
n - 1 -> st_hi[top]
2427
top + 1 -> top
2528
while (top > 0) {
2629
top - 1 -> top
27-
kv·get(st_lo, top) -> lo
28-
kv·get(st_hi, top) -> hi
30+
st_lo[top] -> lo
31+
st_hi[top] -> hi
2932
if (lo < hi) {
30-
kv·get(arr, hi) -> pivot
33+
arr[hi] -> pivot
3134
lo - 1 -> ii
3235
lo -> jj
3336
while (jj < hi) {
34-
kv·get(arr, jj) -> aj
37+
arr[jj] -> aj
3538
if (aj <= pivot) {
3639
ii + 1 -> ii
37-
kv·get(arr, ii) -> ai
38-
aj -> arr·*ii
39-
ai -> arr·*jj
40+
arr[ii] -> ai
41+
aj -> arr[ii]
42+
ai -> arr[jj]
4043
}
4144
jj + 1 -> jj
4245
}
4346
ii + 1 -> pp
44-
kv·get(arr, pp) -> app
45-
pivot -> arr·*pp
46-
app -> arr·*hi
47-
lo -> st_lo·*top
48-
pp - 1 -> st_hi·*top
47+
arr[pp] -> app
48+
pivot -> arr[pp]
49+
app -> arr[hi]
50+
lo -> st_lo[top]
51+
pp - 1 -> st_hi[top]
4952
top + 1 -> top
50-
pp + 1 -> st_lo·*top
51-
hi -> st_hi·*top
53+
pp + 1 -> st_lo[top]
54+
hi -> st_hi[top]
5255
top + 1 -> top
5356
}
5457
}
5558
t1 = time·now()
5659
n ÷ 2 -> mid
5760
n - 1 -> last
58-
kv·get(arr, 0) -> a0
59-
kv·get(arr, mid) -> am
60-
kv·get(arr, last) -> al
61+
arr[0] -> a0
62+
arr[mid] -> am
63+
arr[last] -> al
6164
println("qsort: a0 =", a0, "amid =", am, "alast =", al)
6265
delta = time·sub(t1, t0)
6366
ns = time/duration·as_nanos(delta)
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
timestamp,version,commit,cpu,case,input,samples,kvlang_shm_ns,kvlang_fs_ns,kvlang_redis_ns,python_ns,rust_ns,c_ns,python_ver,rust_ver,c_ver,native_opt,valid
2+
2026-09-11T06:23:01Z,v0.2.17,7cabf55,Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz,binary_search,N=16,3,7313124,226927819,721008200,14125,775,495,3.12.7,1.97.1,13.3.0,gcc -O1 / rustc opt-level=1 / cpython,True
3+
2026-09-11T06:23:01Z,v0.2.17,7cabf55,Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz,binary_search,N=32,3,15726642,510049531,1665331585,24156,1348,1027,3.12.7,1.97.1,13.3.0,gcc -O1 / rustc opt-level=1 / cpython,True
4+
2026-09-11T06:23:01Z,v0.2.17,7cabf55,Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz,binary_search,N=64,3,34739485,1156523966,3888196146,45648,2731,2070,3.12.7,1.97.1,13.3.0,gcc -O1 / rustc opt-level=1 / cpython,True
5+
2026-09-11T06:23:01Z,v0.2.17,7cabf55,Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz,binary_trees,depth=4,3,5439068,285068576,741714334,14280,2432,5703,3.12.7,1.97.1,13.3.0,gcc -O1 / rustc opt-level=1 / cpython,True
6+
2026-09-11T06:23:01Z,v0.2.17,7cabf55,Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz,binary_trees,depth=5,3,10102902,647583144,1486591770,22621,3120,5978,3.12.7,1.97.1,13.3.0,gcc -O1 / rustc opt-level=1 / cpython,True
7+
2026-09-11T06:23:01Z,v0.2.17,7cabf55,Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz,binary_trees,depth=6,3,20038128,1665730463,2959716628,41278,4530,9013,3.12.7,1.97.1,13.3.0,gcc -O1 / rustc opt-level=1 / cpython,True
8+
2026-09-11T06:23:01Z,v0.2.17,7cabf55,Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz,fib,n=8,3,8501530,169606104,564228105,10063,293,347,3.12.7,1.97.1,13.3.0,gcc -O1 / rustc opt-level=1 / cpython,True
9+
2026-09-11T06:23:01Z,v0.2.17,7cabf55,Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz,fib,n=9,3,14082441,274390900,897718626,11933,390,434,3.12.7,1.97.1,13.3.0,gcc -O1 / rustc opt-level=1 / cpython,True
10+
2026-09-11T06:23:01Z,v0.2.17,7cabf55,Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz,fib,n=10,3,22645702,442703420,1466602784,15005,469,639,3.12.7,1.97.1,13.3.0,gcc -O1 / rustc opt-level=1 / cpython,True
11+
2026-09-11T06:23:01Z,v0.2.17,7cabf55,Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz,hash_table,N=50,3,4883936,226509681,689478766,34328,5179,291,3.12.7,1.97.1,13.3.0,gcc -O1 / rustc opt-level=1 / cpython,True
12+
2026-09-11T06:23:01Z,v0.2.17,7cabf55,Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz,hash_table,N=100,3,9612434,542014962,1352878929,61394,8017,422,3.12.7,1.97.1,13.3.0,gcc -O1 / rustc opt-level=1 / cpython,True
13+
2026-09-11T06:23:01Z,v0.2.17,7cabf55,Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz,hash_table,N=200,3,20282647,1465888122,2696365584,112130,15274,754,3.12.7,1.97.1,13.3.0,gcc -O1 / rustc opt-level=1 / cpython,True
14+
2026-09-11T06:23:01Z,v0.2.17,7cabf55,Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz,iops,N=500,3,7517156,360301809,1522084963,23411,438,295,3.12.7,1.97.1,13.3.0,gcc -O1 / rustc opt-level=1 / cpython,True
15+
2026-09-11T06:23:01Z,v0.2.17,7cabf55,Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz,iops,N=1000,3,14693824,704939703,3028980970,45530,797,456,3.12.7,1.97.1,13.3.0,gcc -O1 / rustc opt-level=1 / cpython,True
16+
2026-09-11T06:23:01Z,v0.2.17,7cabf55,Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz,iops,N=2000,3,29213367,1410555284,6077347742,90625,1441,789,3.12.7,1.97.1,13.3.0,gcc -O1 / rustc opt-level=1 / cpython,True
17+
2026-09-11T06:23:01Z,v0.2.17,7cabf55,Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz,k_nucleotide,rep=3,3,11183984,423026404,1570778984,39344,3276,209,3.12.7,1.97.1,13.3.0,gcc -O1 / rustc opt-level=1 / cpython,True
18+
2026-09-11T06:23:01Z,v0.2.17,7cabf55,Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz,k_nucleotide,rep=5,3,21573718,716464129,2652754541,63553,4899,287,3.12.7,1.97.1,13.3.0,gcc -O1 / rustc opt-level=1 / cpython,True
19+
2026-09-11T06:23:01Z,v0.2.17,7cabf55,Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz,k_nucleotide,rep=8,3,42270280,1123691010,4239436534,98025,7474,445,3.12.7,1.97.1,13.3.0,gcc -O1 / rustc opt-level=1 / cpython,True
20+
2026-09-11T06:23:01Z,v0.2.17,7cabf55,Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz,matmul,N=4,3,2494216,136715770,483656644,20395,368,210,3.12.7,1.97.1,13.3.0,gcc -O1 / rustc opt-level=1 / cpython,True
21+
2026-09-11T06:23:01Z,v0.2.17,7cabf55,Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz,matmul,N=6,3,7083273,402128302,1440631693,53986,459,348,3.12.7,1.97.1,13.3.0,gcc -O1 / rustc opt-level=1 / cpython,True
22+
2026-09-11T06:23:01Z,v0.2.17,7cabf55,Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz,matmul,N=8,3,15423851,888971709,3230714695,115948,741,547,3.12.7,1.97.1,13.3.0,gcc -O1 / rustc opt-level=1 / cpython,True
23+
2026-09-11T06:23:01Z,v0.2.17,7cabf55,Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz,nqueens,N=4,3,5590964,165772756,367770434,14053,318,272,3.12.7,1.97.1,13.3.0,gcc -O1 / rustc opt-level=1 / cpython,True
24+
2026-09-11T06:23:01Z,v0.2.17,7cabf55,Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz,nqueens,N=5,3,16894989,519718568,1152138069,23330,561,542,3.12.7,1.97.1,13.3.0,gcc -O1 / rustc opt-level=1 / cpython,True
25+
2026-09-11T06:23:01Z,v0.2.17,7cabf55,Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz,nqueens,N=6,3,48264056,1499696803,3372465913,50155,1535,1456,3.12.7,1.97.1,13.3.0,gcc -O1 / rustc opt-level=1 / cpython,True
26+
2026-09-11T06:23:01Z,v0.2.17,7cabf55,Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz,prime_sieve,N=50,3,12394540,508802480,2110607702,42322,15134,18902,3.12.7,1.97.1,13.3.0,gcc -O1 / rustc opt-level=1 / cpython,True
27+
2026-09-11T06:23:01Z,v0.2.17,7cabf55,Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz,prime_sieve,N=75,3,23866546,1034530878,4335316972,61660,17961,20724,3.12.7,1.97.1,13.3.0,gcc -O1 / rustc opt-level=1 / cpython,True
28+
2026-09-11T06:23:01Z,v0.2.17,7cabf55,Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz,prime_sieve,N=100,3,34597505,1506271857,6433111590,82541,21256,23008,3.12.7,1.97.1,13.3.0,gcc -O1 / rustc opt-level=1 / cpython,True
29+
2026-09-11T06:23:01Z,v0.2.17,7cabf55,Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz,quicksort,"N=32,seed=1",3,7643381,398343054,1424143169,18634,1143,1014,3.12.7,1.97.1,13.3.0,gcc -O1 / rustc opt-level=1 / cpython,True
30+
2026-09-11T06:23:01Z,v0.2.17,7cabf55,Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz,quicksort,"N=64,seed=1",3,16954506,875656570,3313404372,33625,2424,2231,3.12.7,1.97.1,13.3.0,gcc -O1 / rustc opt-level=1 / cpython,True
31+
2026-09-11T06:23:01Z,v0.2.17,7cabf55,Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz,quicksort,"N=128,seed=1",3,36533670,1926614467,7222936156,65903,5071,4766,3.12.7,1.97.1,13.3.0,gcc -O1 / rustc opt-level=1 / cpython,True

benchmark/run.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,10 @@
6161
"hash_table": [50, 100, 200],
6262
"matmul": [4, 6, 8],
6363
"k_nucleotide": [3, 5, 8],
64+
# 同一算法的 compact 形态:数组落单个 ARRAYND XValue(`[N]T`),而非每元素一个 key 的散 key map。
65+
# 与 matmul / quicksort 同规模、同基线(native 三份与原 case 算法完全一致,仅输出标签不同)。
66+
"matmul_compact": [4, 6, 8],
67+
"quicksort_compact": [32, 64, 128],
6468
}
6569
SCALE_ENV = "BENCH_SCALE" # python/rust/c 从此环境变量读规模
6670
SCALE_TOKEN = "__SCALE__" # kvlang 源码里的规模占位符

deps.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
2-
"kvspace": "v0.2.16",
3-
"kvspace-c": "v0.2.16",
4-
"kvspace-durable": "v0.2.16",
2+
"kvspace": "v0.2.17",
3+
"kvspace-c": "v0.2.17",
4+
"kvspace-durable": "v0.2.17",
55
"blockmalloc": "v0.1.4",
66
"slotsboxmalloc": "v0.1.5"
77
}

error_cases/array_param/mutate_correct.kv

Lines changed: 0 additions & 16 deletions
This file was deleted.

error_cases/array_param/mutate_literal.kv

Lines changed: 0 additions & 14 deletions
This file was deleted.

0 commit comments

Comments
 (0)