Nature vs Golang: 性能基准测试 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
weiwenhao
1.51D
V2EX    程序员

Nature vs Golang: 性能基准测试

  •  
  •   weiwenhao
    weiwenhao 5 小时 19 分钟前 1157 次点击

    nature 是一款较新的编程语言,其轻量简单,易于学习。在设计理念和运行时架构上参考了 golang ,同时有着更丰富的语法特性,更适用于业务开发,并在持续探索更广泛的应用领域。

    性能是衡量编程语言核心竞争力的关键指标,接下来我们将从 IO 并发、CPU 计算、C 语言 FFI 、协程性能四个维度,并以 golang 作为基准对 nature 编程语言进行性能测试。

    测试环境

    配置项 详情
    宿主机 Apple Mac mini M4 ,16GB 内存
    测试环境 Linux 虚拟机( Ubuntu 6.17.8 ,aarch64 架构)
    编译器 / 运行时版本 Nature:v0.7.0 ( release build 2025-12-15 )
    Golang:go1.23.4 linux/arm64
    Rust:cargo 1.85.0
    Node.js:v20.16.0

    所有测试均采用相同的代码逻辑实现,文中代码示例均以 nature 编程语言为例。

    IO 并发

    IO 并发是网络服务的核心能力,本测试通过 HTTP 服务端压力测试,综合考察语言的 IO 调度、CPU 利用率与 GC 稳定性。

    nature 代码示例

    import http fn main() { var app = http.server() app.get('/', fn( http.request_t req, ptr<http.response_t> res):void! { res.send('hello nature') }) app.listen(8888) } 

    ab 工具测试命令

    ab -n 100000 -c 1000 http://127.0.0.1:8888/ 
    • -n 100000: 总请求数 10 万次
    • -c 1000: 并发数 1000

    测试结果

    可以看到 nature 在 HTTP 并发性能上超越了 golang ,这对于早期版本的编程语言来说可以说是不错的成绩。

    由于 nature 和 node.js 均使用 libuv 作为 IO 后端,所以 node.js 也参与到基准测试中(libuv 线程不安全,node.js 和 nature 的事件循环均在单线程中运行),但 nature 作为编译型语言其并发处理能力远胜过 node.js 。

    CPU 计算

    使用经典的递归斐波那契数列计算 fib(45) 来测试语言的 CPU 计算与高频函数调用开销。

    nature 代码示例

    fn fib(int n):int { if (n <= 1) { return n } return fib(n - 1) + fib(n - 2) } 

    测试方法

    time ./main 1134903170./main 2.50s user 0.01s system 101% cpu 2.473 total 

    测试结果:

    nature 和 golang 均采用自研的编译器后端,性能上也相差无几。而耗时高于 rust 的主要原因之一是两者在函数运行前进行了额外处理。

    golang 采用了抢占式调度,不需要关注 GC safepoint ,但仍需要关注协程栈是否需要扩容,也就是下面的汇编指令

    # more stack f9400b90 ldr x16, [x28, #16] eb3063ff cmp sp, x16 540002a9 b.ls 7869c <main.Fib+0x5c> // b.plas 

    nature 采用了协作式调度,所以需要处理 GC safepoint 。但 nature 采用共享栈协程,所以不需要关心栈扩容问题。

    # safepoint adrp x16, 0xa9d000 add x16, x16, #0xeb0 ldr x16, [x16] cmp x16, #0x0 b.ne 0x614198 <main.fib.preempt> 

    nature 的 safepoint 实现仍有优化空间,若后续采用 SIGSEGV 的触发模式,函数调用性能将会得到进一步提升。

    nature 和 golang 采用了截然不同的调度策略和协程设计方案,这会带来哪些不同呢?不妨看看后续的测试

    C 语言 FFI

    通过调用 1 亿次 C 标准库中的 sqrt 函数,测试与 C 语言的协作效率。

    nature 代码示例

    import libc fn main() { for int i = 0; i < 100000000; i+=1 { var r = libc.sqrt(4) } } 

    测试结果

    可以看到在 C FFI 方面,nature 相较于 golang 有着非常大的优势,这是因为 golang 的 CGO 模块有着非常高的性能成本,独立栈协程和抢占式调度设计与 C 语言难以兼容,需要经过复杂的处理。

    而 nature 的共享栈和协作式调度设计与 C 语言更兼容,不仅仅是 C 语言,只要符合 ABI 规范的二进制库,nature 都能直接进行调用。

    在高性能计算、底层硬件操作等场景中,nature 可无缝集成 C / 汇编编写的核心模块,弥补 GC 语言在极致性能场景下的不足,兼顾开发效率与底层性能。

    协程

    协程是现代并发编程的核心组件,本测试通过 “百万协程创建 + 切换 + 简单计算” 场景,评估 Nature 与 Golang 的协程调度效率、内存占用与响应速度。

    nature 代码示例

    import time import co var count = 0 fn sum_co() { count += 1 co.sleep(10000) // ms, Remove this line if no sleep } fn main() { var start = time.now().ms_timestamp() for int i = 0; i < 1000000; i+=1 { go sum_co() } println(time.now().ms_timestamp() - start) // create time int prev_count = 0 for prev_count != count { println(time.now().ms_timestamp() - start, count) prev_count = count co.sleep(10) } println(time.now().ms_timestamp() - 10 - start) // calc time co.sleep(3000) // ms } 

    测试结果

    语言/th> 创建耗时(ms) 计算耗时(ms) 无 sleep 计算耗时(ms) 占用内存
    Nature 540 564 170 900+M
    Golang 1000 1015 140 2500+M

    nature 的协程在综合性能上非常优秀,内存占用更是远低于 golang 。而这是建立在 nature 的协程调度器未进行优化的前提下,预计在后续的版本中 nature 的协程调度器会进一步优化,届时将会有更加亮眼的表现。

    总结

    这是一次非专业的性能测试,但在粗略的测试中,nature 编程语言展现出了超越预期的能力与潜力。作为早期的编程语言,其运行时和编译器还有着非常大的优化空间,在正式版本发布时性能将进一步提升。

    以现在的性能表现来看,nature 无疑是值得关注和尝试的编程语言,尤其是在云原生、网络服务、API 开发等服务端开发领域。


    这是 nature 编程语言的官网 https://nature-lang.cn/ 如果你感兴趣的话也可以加入讨论组,v nature-lang

    19 条回复    2025-12-22 15:17:37 +08:00
    craftsmanship
        1
    craftsmanship  
       5 小时 4 分钟前 via Android   1
    又见大佬
    zhanying
        2
    zhanying  
       5 小时 1 分钟前   1
    不懂就问,新的编程语言 vibe coding 效果咋样
    weiwenhao
        3
    weiwenhao  
    OP
       4 小时 57 分钟前
    @zhanying 基于类似 CLAUDE.md 这样的提示词可以达到不错的效果,但是如果是三方库的话,需要有一份 awesome 收集才行。另外就是语法简单,有强类型约束的话 AI 的正确率会更好。
    wweir
        4
    wweir  
       4 小时 53 分钟前   1
    gust
    go 的文件头 + rust 的语法习惯
    cmos
        5
    cmos  
       4 小时 50 分钟前   1
    从易用性和方便尝鲜的角度来看,我觉得可以实现一个类似 rust 的安装命令(安装在用户目录而不是系统目录),并考虑借鉴 cargo 的功能,填充 Golang 的实用性和 rust cargo 易用性之间的空白区域。
    wfhtqp
        6
    wfhtqp  
       4 小时 49 分钟前   1
    golang 也有被当作对手的一天
    weiwenhao
        7
    weiwenhao  
    OP
       4 小时 46 分钟前
    @cmos 很有道理,后续如果实现 install.sh 的话就默认安装在用户目录。
    weiwenhao
        8
    weiwenhao  
    OP
       4 小时 34 分钟前
    @wfhtqp 我一时都没有理解,这句话指的是 golang 这么强也能当做对手,还是指的 golang 这么弱也配当做对手
    NoobPhper
        9
    NoobPhper  
       4 小时 26 分钟前
    文档字体好看 是叫啥
    weiwenhao
        10
    weiwenhao  
    OP
       4 小时 20 分钟前
    @NoobPhper Operator Mono 或者 IBM Plex Mono
    Donahue
        11
    Donahue  
       1 小时 9 分钟前   1
    大佬 太强了
    xiuming
        12
    xiuming  
       45 分钟前   1
    @weiwenhao #8 golang 是弱鸡都还要从 php 和 java 那里抢份额
    dog82
        13
    dog82  
        1
    用 go 好几年,我依然钟爱 java
    linky6565
        14
    linky6565  
       34 分钟前   1
    早期版本就能做到性能如此优秀的确了不起
    hutoer
        15
    hutoer  
       33 分钟前   1
    语法比垃圾 Golang 好,预祝能火起来
    gggggggg
        16
    gggggggg  
       17 分钟前
    为什么所有语言都想来和 golang 比一下?
    gggggggg
        17
    gggggggg  
       14 分钟前
    @gggggggg 收回我刚说的话,nature-lang 还是一个国内大佬写的?那要支持下。
    fregie
        18
    fregie  
       7 分钟前
    我想问一下,这个语言,主要适用于什么场景,或者解决了什么问题呢?
    brucedone
        19
    brucedone  
       3 分钟前
    像 rust ,又像 go ,算是二者的中间集?
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5180 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 07:21 PVG 15:21 LAX 23:21 JFK 02:21
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86