Nolang采用静态编译直接生成LLVMIR,以最小运行时开销获得接近原生代码的效率。在AppleM1上运行fib(40)千万次基准测试,与C、Rust、Go对比,其性能表现优异,接近C语言水平,优于Go和Rust。

| 项目 | 值 |
|---|---|
| CPU | Apple M1 (ARM64, 3.2GHz) |
| RAM | 16 GB |
| OS | macOS 15.x |
| C 编译器 | zig cc 0.16.0 (-O2 -target aarch64-macos) |
| Rust 编译器 | rustc 1.91.0 (-O) |
| Go 编译器 | go 1.22.x (go build -ldflags="-s -w") |
| Nolang | nolang-build --target llvm → zig cc -O2 |
四种语言采用完全相同的逻辑结构:引用传值输出参数,计算 fib(40) × 10,000,000 次。
长期稳定更新的攒劲资源: >>>点此立即查看<<<
test/bench/fib.no)fib(n i64, o i64) {a = 0b = 1i = 2for i <= n {c = a ba = bb = ci = i 1}o = b}for iter = 0; iter < 10000000; iter {result = 0fib(40, result)println-i64(result)}
test/bench/fib.c)#include
test/bench/fib.rs)fn fib(n: i64, o: &mut i64) { let mut a = 0;let mut b = 1;let mut i = 2;while i <= n { let c = a b;a = b;b = c;i = 1;}*o = b;}fn main() { for _ in 0..10000000 { let mut result: i64 = 0;fib(40, &mut result);println!("{}", result);}}
test/bench/fib.go)package mainimport "fmt"func fib(n int64, o *int64) { var a, b, c int64 = 0, 1, 0var i int64 = 2for i <= n { c = a ba = bb = ci }*o = b}func main() { for iter := 0; iter < 10000000; iter { var result int64 = 0fib(40, &result)fmt.Println(result)}}
macOS /usr/bin/time -l,记录:
real — 真实执行时间user — 用户态 CPU 时间sys — 系统态 CPU 时间instructions retired — 退休指令数(硬件计数器)peak memory footprint — 峰值内存用量| 语言 | 编译器 | 大小 | 相对 C |
|---|---|---|---|
| C | zig cc -O2 | 49K | 1.0× |
| Nolang | zig cc -O2 | 49K | 1.0× |
| Rust | rustc -O | 456K | 9.3× |
| Go | go build -s -w | 1.5M | 31× |
fib(40) × 10,000,000 次,含输出 I/O:
| 语言 | real | user | sys | 指令数 | 峰值 RSS |
|---|---|---|---|---|---|
| C (zig cc) | 4.88s | 0.62s | 0.04s | 11.0B | 935KB |
| Nolang (zig cc) | 5.38s | 0.61s | 0.04s | 11.1B | 935KB |
| Rust (rustc -O) | 5.44s | 1.61s | 3.78s | 54.6B | 935KB |
| Go (go build) | 6.25s | 2.52s | 3.72s | 60.9B | 8.8MB |
C : 11.0B████Nolang: 11.1B████ ← 仅多 1%Rust: 54.6B████████████████████Go: 60.9B██████████████████████
在 macOS 上,所有程序都必须动态链接 /usr/lib/libSystem.B.dylib(核心系统库)。这不是语言选择,而是操作系统的限制——macOS 不提供静态版本的 libSystem。
# 所有语言的链接状况完全相同otool -L fib_nolang→ /usr/lib/libSystem.B.dylibotool -L fib_c → /usr/lib/libSystem.B.dylibotool -L fib_rust→ /usr/lib/libSystem.B.dylibotool -L fib_go→ /usr/lib/libSystem.B.dylib
Go 也额外链接了 /usr/lib/libresolv.9.dylib,但这同样是系统动态库。
因为 libSystem.dylib 在运行期由所有程序共享,可执行文件大小的比较反映的是语言 runtime + 标准库的额外体积:
| 语言 | 文件大小 | 包含的静态内容 |
|---|---|---|
| C / Nolang | 49K | printf + 启动代码(无 runtime) |
| Rust | 456K | Rust 标准库(格式化、panic handler、hash) |
| Go | 1.5M | Go runtime(GC、goroutine scheduler、fmt 反射) |
如果需要在 Linux 上进行完全静态比较,可使用 zig cc 的 musl 目标:
# 静态编译(x86_64 Linux musl libc)zig cc -O2 -target x86_64-linux-musl -static -o fib_c_static fib.c
这种方式产生的二进制完全静态,不依赖任何系统 .so。但性能数据因 OS / libc 不同无法与 macOS 直接比较。
Nolang: .no → lexer + parser → LLVM IR → zig cc -O2 → 可执行文件C:.c → zig cc -O2 → 可执行文件Rust: .rs → rustc -O → 可执行文件(含 std)Go: .go → go build → 可执行文件(含 runtime)
# 编译zig cc -O2 -target aarch64-macos -o test/bench/fib_c_zig test/bench/fib.czig cc -O2 -target aarch64-macos test/bench/fib_nolang.ll -o test/bench/fib_nolang_zigrustc -O -o test/bench/fib_rust test/bench/fib.rsgo build -ldflags="-s -w" -o test/bench/fib_go test/bench/fib.go# 执行 + 测量/usr/bin/time -l test/bench/fib_c_zig/usr/bin/time -l test/bench/fib_nolang_zig/usr/bin/time -l test/bench/fib_rust/usr/bin/time -l test/bench/fib_go# 或使用自动化脚本bash test/bench/run.sh
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述