Baseline 支持 Bulk Memory
Baseline Wasm 配置允许批量内存操作,可用于数组复制和填充。
CALCKERNEL 语言
CalcKernel(CK)是一门面向数值密集型任务的静态类型语言。它将 CK 程序编译为原生机器码,也可输出 C 和 WebAssembly,嵌入已有系统。
CK 为嵌入大型应用的紧凑计算例程而设计。类型系统、明确的数值规则和清楚的数据接口,帮助开发者判断内核读取、修改和返回什么。
函数签名写明输入和结果的类型。编译时,CK 会检查函数调用和赋值是否匹配。
fn scale(x: f64) -> f64了解更多 02 / 04类型转换需要明确写出,浮点行为有规范定义。Native 与 C 构建可启用整数溢出检查。
i32 · f64 · checked了解更多 03 / 04类型化切片包含地址和长度。内核读取或修改的内存由你的应用提供并负责管理。
slice<f64> · data · len了解更多 04 / 04可构建 Native 可执行文件或库、生成带 ABI 头文件的 C 代码,或生成兼容运行时可加载的 WebAssembly 模块。
Native · C ABI · Wasm了解更多 这个内核将调用方提供的 f64 切片中的每个值乘以一个系数。类型化输入与原地更新明确了数据边界;编译器只会在满足正确性条件且目标平台支持时应用相应变换。
了解语言设计export fn scale(
values: slice<f64>,
factor: f64
) -> void {
let i: u32 = 0;
while i < values.len {
values[i] = values[i] * factor;
i = i + 1;
}
}slice<f64> · while · export fn选个算法,看看原有对比与新增 WASM 实测。
1,048,576 个 u32 数值;顺序累加并按 2³² 取模
| 语言 | 每次调用耗时中位数 | 相对 JavaScript 的速度倍率 |
|---|---|---|
| CK Native | 0.0357 ms | 7.1x |
| Rust | 0.0356 ms | 7.1x |
| C++ | 0.0356 ms | 7.1x |
| Java | 0.2312 ms | 1.1x |
| JavaScript (Node.js) | 0.2518 ms | 1.0x |
| 语言 | 每次调用耗时中位数 | 相对较快 Clang/Rust 参考项的吞吐率 |
|---|---|---|
| Rust WASM | 0.2533 ms | 1.0x |
| CK WASM | 0.2563 ms | 0.99x |
| Clang WASM | 0.2548 ms | 0.99x |
| 语言 | 每次调用耗时中位数 | 相对较快 Clang/Rust 参考项的吞吐率 |
|---|---|---|
| Clang WASM | 0.1233 ms | 1.0x |
| CK WASM | 0.1241 ms | 0.99x |
| Rust WASM | 0.1242 ms | 0.99x |
v0.15.1:JavaScript = 1.0x · strict WASM:同一 profile 中较快的 Clang/Rust 实现 = 1.0x · Apple M5 Max · 柱长采用压缩刻度。两份报告的耗时与倍率不可直接比较。Strict 用时并非 v0.15.2 正式版二进制测得。CK WASM 计入 Node.js 调用,不计初始化和输入复制。
256 × 256 的 f64 矩阵;行、内层、列循环顺序;不调用 BLAS
| 语言 | 每次调用耗时中位数 | 相对 JavaScript 的速度倍率 |
|---|---|---|
| CK Native | 1.9950 ms | 5.2x |
| C++ | 1.9798 ms | 5.2x |
| Rust | 2.0394 ms | 5.1x |
| Java | 3.4306 ms | 3.0x |
| JavaScript (Node.js) | 10.3170 ms | 1.0x |
| 语言 | 每次调用耗时中位数 | 相对较快 Clang/Rust 参考项的吞吐率 |
|---|---|---|
| CK WASM | 3.5093 ms | 1.0x |
| Clang WASM | 3.6087 ms | 1.0x |
| Rust WASM | 7.1704 ms | 0.50x |
| 语言 | 每次调用耗时中位数 | 相对较快 Clang/Rust 参考项的吞吐率 |
|---|---|---|
| Clang WASM | 2.5720 ms | 1.0x |
| Rust WASM | 2.6213 ms | 0.98x |
| CK WASM | 2.6415 ms | 0.97x |
v0.15.1:JavaScript = 1.0x · strict WASM:同一 profile 中较快的 Clang/Rust 实现 = 1.0x · Apple M5 Max · 柱长采用压缩刻度。两份报告的耗时与倍率不可直接比较。Strict 用时并非 v0.15.2 正式版二进制测得。CK WASM 计入 Node.js 调用,不计初始化和输入复制。
1024 × 1024 个 f64 像素;高斯权重,边缘置零
| 语言 | 每次调用耗时中位数 | 相对 JavaScript 的速度倍率 |
|---|---|---|
| CK Native | 0.5494 ms | 5.1x |
| C++ | 0.9910 ms | 2.8x |
| Rust | 1.4008 ms | 2.0x |
| Java | 1.7006 ms | 1.7x |
| JavaScript (Node.js) | 2.8178 ms | 1.0x |
| 语言 | 每次调用耗时中位数 | 相对较快 Clang/Rust 参考项的吞吐率 |
|---|---|---|
| CK WASM | 1.1388 ms | 1.0x |
| Clang WASM | 1.1821 ms | 1.0x |
| Rust WASM | 1.7024 ms | 0.69x |
| 语言 | 每次调用耗时中位数 | 相对较快 Clang/Rust 参考项的吞吐率 |
|---|---|---|
| CK WASM | 0.7476 ms | 1.0x |
| Rust WASM | 0.7557 ms | 1.0x |
| Clang WASM | 1.1787 ms | 0.64x |
v0.15.1:JavaScript = 1.0x · strict WASM:同一 profile 中较快的 Clang/Rust 实现 = 1.0x · Apple M5 Max · 柱长采用压缩刻度。两份报告的耗时与倍率不可直接比较。Strict 用时并非 v0.15.2 正式版二进制测得。CK WASM 计入 Node.js 调用,不计初始化和输入复制。
262,144 个 f64 数值;七次多项式 Horner 求值
| 语言 | 每次调用耗时中位数 | 相对 JavaScript 的速度倍率 |
|---|---|---|
| CK Native | 0.1222 ms | 2.0x |
| C++ | 0.1219 ms | 2.0x |
| Rust | 0.1226 ms | 2.0x |
| JavaScript (Node.js) | 0.2443 ms | 1.0x |
| Java | 0.2444 ms | 1.00x |
| 语言 | 每次调用耗时中位数 | 相对较快 Clang/Rust 参考项的吞吐率 |
|---|---|---|
| CK WASM | 0.2356 ms | 1.0x |
| Clang WASM | 0.2420 ms | 1.0x |
| Rust WASM | 0.2427 ms | 1.00x |
| 语言 | 每次调用耗时中位数 | 相对较快 Clang/Rust 参考项的吞吐率 |
|---|---|---|
| Rust WASM | 0.1258 ms | 1.0x |
| Clang WASM | 0.1261 ms | 1.00x |
| CK WASM | 0.1265 ms | 0.99x |
v0.15.1:JavaScript = 1.0x · strict WASM:同一 profile 中较快的 Clang/Rust 实现 = 1.0x · Apple M5 Max · 柱长采用压缩刻度。两份报告的耗时与倍率不可直接比较。Strict 用时并非 v0.15.2 正式版二进制测得。CK WASM 计入 Node.js 调用,不计初始化和输入复制。
1,048,576 个确定性采样点;含随机数生成的 π 命中计数
| 语言 | 每次调用耗时中位数 | 相对 JavaScript 的速度倍率 |
|---|---|---|
| Java | 1.0429 ms | 3.9x |
| CK Native | 2.0477 ms | 2.0x |
| Rust | 2.0393 ms | 2.0x |
| C++ | 2.0498 ms | 2.0x |
| JavaScript (Node.js) | 4.0760 ms | 1.0x |
| 语言 | 每次调用耗时中位数 | 相对较快 Clang/Rust 参考项的吞吐率 |
|---|---|---|
| Rust WASM | 1.1140 ms | 1.0x |
| Clang WASM | 1.1172 ms | 1.00x |
| CK WASM | 1.1388 ms | 0.98x |
| 语言 | 每次调用耗时中位数 | 相对较快 Clang/Rust 参考项的吞吐率 |
|---|---|---|
| Clang WASM | 1.1118 ms | 1.0x |
| Rust WASM | 1.1172 ms | 1.00x |
| CK WASM | 1.1359 ms | 0.98x |
v0.15.1:JavaScript = 1.0x · strict WASM:同一 profile 中较快的 Clang/Rust 实现 = 1.0x · Apple M5 Max · 柱长采用压缩刻度。两份报告的耗时与倍率不可直接比较。Strict 用时并非 v0.15.2 正式版二进制测得。CK WASM 计入 Node.js 调用,不计初始化和输入复制。
262,144 个 f64 数值;单次遍历组合乘、加和减
| 语言 | 每次调用耗时中位数 | 相对 JavaScript 的速度倍率 |
|---|---|---|
| CK Native | 0.0499 ms | 2.0x |
| C++ | 0.0499 ms | 2.0x |
| Rust | 0.0500 ms | 2.0x |
| Java | 0.0916 ms | 1.1x |
| JavaScript (Node.js) | 0.0978 ms | 1.0x |
| 语言 | 每次调用耗时中位数 | 相对较快 Clang/Rust 参考项的吞吐率 |
|---|---|---|
| Clang WASM | 0.1070 ms | 1.0x |
| Rust WASM | 0.1085 ms | 0.99x |
| CK WASM | 0.1161 ms | 0.92x |
| 语言 | 每次调用耗时中位数 | 相对较快 Clang/Rust 参考项的吞吐率 |
|---|---|---|
| CK WASM | 0.0675 ms | 1.0x |
| Clang WASM | 0.0698 ms | 1.0x |
| Rust WASM | 0.0699 ms | 1.00x |
v0.15.1:JavaScript = 1.0x · strict WASM:同一 profile 中较快的 Clang/Rust 实现 = 1.0x · Apple M5 Max · 柱长采用压缩刻度。两份报告的耗时与倍率不可直接比较。Strict 用时并非 v0.15.2 正式版二进制测得。CK WASM 计入 Node.js 调用,不计初始化和输入复制。
8,388,608 个 f64 数值;输入和输出共 128 MiB 的流式变换
| 语言 | 每次调用耗时中位数 | 相对 JavaScript 的速度倍率 |
|---|---|---|
| CK Native | 1.0922 ms | 1.8x |
| C++ | 1.0888 ms | 1.8x |
| Rust | 1.0892 ms | 1.8x |
| Java | 1.2688 ms | 1.5x |
| JavaScript (Node.js) | 1.9619 ms | 1.0x |
| 语言 | 每次调用耗时中位数 | 相对较快 Clang/Rust 参考项的吞吐率 |
|---|---|---|
| Clang WASM | 1.6348 ms | 1.0x |
| Rust WASM | 1.6670 ms | 0.98x |
| CK WASM | 1.7009 ms | 0.96x |
| 语言 | 每次调用耗时中位数 | 相对较快 Clang/Rust 参考项的吞吐率 |
|---|---|---|
| CK WASM | 1.2464 ms | 1.1x |
| Clang WASM | 1.3770 ms | 1.0x |
| Rust WASM | 1.3875 ms | 0.99x |
v0.15.1:JavaScript = 1.0x · strict WASM:同一 profile 中较快的 Clang/Rust 实现 = 1.0x · Apple M5 Max · 柱长采用压缩刻度。两份报告的耗时与倍率不可直接比较。Strict 用时并非 v0.15.2 正式版二进制测得。CK WASM 计入 Node.js 调用,不计初始化和输入复制。
1024 个顶点的稠密图;O(V²) 线性选取最小距离
| 语言 | 每次调用耗时中位数 | 相对 JavaScript 的速度倍率 |
|---|---|---|
| CK Native | 2.2883 ms | 1.7x |
| C++ | 2.2825 ms | 1.7x |
| Java | 2.3657 ms | 1.7x |
| Rust | 2.3675 ms | 1.7x |
| JavaScript (Node.js) | 3.9375 ms | 1.0x |
| 语言 | 每次调用耗时中位数 | 相对较快 Clang/Rust 参考项的吞吐率 |
|---|---|---|
| Clang WASM | 2.5771 ms | 1.0x |
| Rust WASM | 2.6047 ms | 0.99x |
| CK WASM | 2.7245 ms | 0.95x |
| 语言 | 每次调用耗时中位数 | 相对较快 Clang/Rust 参考项的吞吐率 |
|---|---|---|
| Rust WASM | 2.6271 ms | 1.0x |
| Clang WASM | 2.6547 ms | 0.99x |
| CK WASM | 2.7301 ms | 0.96x |
v0.15.1:JavaScript = 1.0x · strict WASM:同一 profile 中较快的 Clang/Rust 实现 = 1.0x · Apple M5 Max · 柱长采用压缩刻度。两份报告的耗时与倍率不可直接比较。Strict 用时并非 v0.15.2 正式版二进制测得。CK WASM 计入 Node.js 调用,不计初始化和输入复制。
262,144 个 f64 数值;四段顺序条件分支
| 语言 | 每次调用耗时中位数 | 相对 JavaScript 的速度倍率 |
|---|---|---|
| C++ | 0.2207 ms | 6.2x |
| Rust | 0.8266 ms | 1.7x |
| CK Native | 0.8360 ms | 1.6x |
| JavaScript (Node.js) | 1.3766 ms | 1.0x |
| Java | 1.3771 ms | 1.00x |
| 语言 | 每次调用耗时中位数 | 相对较快 Clang/Rust 参考项的吞吐率 |
|---|---|---|
| CK WASM | 0.3102 ms | 3.8x |
| Rust WASM | 1.1857 ms | 1.0x |
| Clang WASM | 1.1943 ms | 0.99x |
| 语言 | 每次调用耗时中位数 | 相对较快 Clang/Rust 参考项的吞吐率 |
|---|---|---|
| CK WASM | 0.1342 ms | 1.1x |
| Rust WASM | 0.1464 ms | 1.0x |
| Clang WASM | 1.2204 ms | 0.12x |
v0.15.1:JavaScript = 1.0x · strict WASM:同一 profile 中较快的 Clang/Rust 实现 = 1.0x · Apple M5 Max · 柱长采用压缩刻度。两份报告的耗时与倍率不可直接比较。Strict 用时并非 v0.15.2 正式版二进制测得。CK WASM 计入 Node.js 调用,不计初始化和输入复制。
262,144 个 f64 数值;两次遍历完成最小最大值归一化
| 语言 | 每次调用耗时中位数 | 相对 JavaScript 的速度倍率 |
|---|---|---|
| CK Native | 0.1599 ms | 1.3x |
| Rust | 0.1612 ms | 1.2x |
| JavaScript (Node.js) | 0.2009 ms | 1.0x |
| Java | 0.2405 ms | 0.84x |
| C++ | 0.2877 ms | 0.70x |
| 语言 | 每次调用耗时中位数 | 相对较快 Clang/Rust 参考项的吞吐率 |
|---|---|---|
| CK WASM | 0.1797 ms | 1.1x |
| Clang WASM | 0.1954 ms | 1.0x |
| Rust WASM | 0.2028 ms | 0.96x |
| 语言 | 每次调用耗时中位数 | 相对较快 Clang/Rust 参考项的吞吐率 |
|---|---|---|
| CK WASM | 0.1472 ms | 1.1x |
| Clang WASM | 0.1669 ms | 1.0x |
| Rust WASM | 0.1739 ms | 0.96x |
v0.15.1:JavaScript = 1.0x · strict WASM:同一 profile 中较快的 Clang/Rust 实现 = 1.0x · Apple M5 Max · 柱长采用压缩刻度。两份报告的耗时与倍率不可直接比较。Strict 用时并非 v0.15.2 正式版二进制测得。CK WASM 计入 Node.js 调用,不计初始化和输入复制。
262,144 对 f64 数值;按索引递增顺序累加
| 语言 | 每次调用耗时中位数 | 相对 JavaScript 的速度倍率 |
|---|---|---|
| CK Native | 0.1273 ms | 1.2x |
| C++ | 0.1266 ms | 1.2x |
| Rust | 0.1272 ms | 1.2x |
| Java | 0.1312 ms | 1.1x |
| JavaScript (Node.js) | 0.1489 ms | 1.0x |
| 语言 | 每次调用耗时中位数 | 相对较快 Clang/Rust 参考项的吞吐率 |
|---|---|---|
| Clang WASM | 0.1537 ms | 1.0x |
| Rust WASM | 0.1539 ms | 1.00x |
| CK WASM | 0.1671 ms | 0.92x |
| 语言 | 每次调用耗时中位数 | 相对较快 Clang/Rust 参考项的吞吐率 |
|---|---|---|
| Rust WASM | 0.1537 ms | 1.0x |
| Clang WASM | 0.1537 ms | 1.00x |
| CK WASM | 0.1664 ms | 0.92x |
v0.15.1:JavaScript = 1.0x · strict WASM:同一 profile 中较快的 Clang/Rust 实现 = 1.0x · Apple M5 Max · 柱长采用压缩刻度。两份报告的耗时与倍率不可直接比较。Strict 用时并非 v0.15.2 正式版二进制测得。CK WASM 计入 Node.js 调用,不计初始化和输入复制。
图中各实现使用相同的固定输入。
| 语言 | 每次调用耗时中位数 | 相对 JavaScript 的速度倍率 |
|---|---|---|
| CK | 1.8697 ms | 5.4x |
| C++ | 1.8661 ms | 5.4x |
| Rust | 1.8935 ms | 5.3x |
| Java | 3.1163 ms | 3.2x |
| JavaScript | 10.0876 ms | 1.0x |
历史同机跨运行环境对比 · 只展示调优版 · JavaScript = 1.0x。这份早期报告早于 v0.15.1 套件,且不含 CK Wasm 结果。矩阵乘法不展示 NumPy,因为它会调用 Apple Accelerate。
对每个内部像素执行相同的九点加权滤波;边缘像素设为 0。
| 语言 | 每次调用耗时中位数 | 相对 JavaScript 的速度倍率 |
|---|---|---|
| C++ | 0.5323 ms | 4.1x |
| Rust | 0.5477 ms | 4.0x |
| CK | 0.5972 ms | 3.7x |
| Java | 1.0417 ms | 2.1x |
| JavaScript | 2.2031 ms | 1.0x |
| NumPy | 3.4438 ms | 0.64x |
历史同机跨运行环境对比 · 只展示调优版 · JavaScript = 1.0x。这份早期报告早于 v0.15.1 套件,且不含 CK Wasm 结果。图像模糊工作负载保留 NumPy 结果。
CK 适用于嵌入大型系统的数值内核,例如数据变换、反复执行的评分或模拟,以及其他计算密集型例程。将数据契约放在边界,调度、存储和面向用户的功能交给宿主应用。
对调用方传入的数值数组进行归一化、缩放或其他逐项处理。
slice<f64> → values用类型化输入、明确分支和可预期的数值规则,表达需要重复执行的领域计算。
score(input) → f64将同一段专注的计算构建为 Native 库、C 接口或 WebAssembly 模块。
Native · C ABI · WasmCK 聚焦计算内核。宿主应用负责内存管理,以及内核周边的输入输出、网络和界面。
v0.15.2 优化符合条件的 WebAssembly 内核,同时保持严格浮点行为、安全证明和调用方提供内存的 ABI。
Baseline Wasm 配置允许批量内存操作,可用于数组复制和填充。
在 O3 并启用 simd128 时,符合条件的连续映射和归约可使用向量指令;其他循环保留标量代码。
schema 2 记录所选 Wasm profile 及其摘要,供宿主检查兼容性。
现有的调用方提供内存 ABI 保持不变,宿主继续负责数据并将其传入内核。
应用仍用你熟悉的工具编写;让 CK 负责边界明确、需要反复执行的数值计算。
如果它们已经满足项目需要,就继续使用。CK 更专注于数值内核:同一份源码可构建 Native 库、生成 C 代码或 WebAssembly 模块,供现有程序调用。优势在于清晰的计算边界;速度仍要用你的负载实测。
查看实测结果先通过性能分析找到耗时明显、反复执行的计算,并确认它有清晰的数值输入和结果。如果同一内核还要供多个应用或运行环境使用,CK 的独立构建方式更有价值。
了解输出方式先导出 CK 函数并构建模块,再由现有项目调用。Node.js 可加载 WebAssembly;Python 和 Rust 可通过生成的 C ABI 调用 Native 库。数据和内存仍由宿主负责。
先了解语言、运行一个内核,再使用相同输入和目标机器对照测量结果。
使用 VS Code 编写 CK?扩展提供语法高亮、实时错误提示、补全和代码导航。 了解 VS Code 扩展