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

Nature vs Golang: 性能基准测试

  •  
  •   weiwenhao ·
    weiwenhao · 18 小时 58 分钟前 · 2464 次点击

    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
    } 
    

    测试结果

    语言 创建耗时(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

    42 条回复    2025-12-23 03:13:09 +08:00
    craftsmanship
        1
    craftsmanship  
       18 小时 42 分钟前 via Android   ❤️ 1
    🐮 又见大佬
    zhanying
        2
    zhanying  
       18 小时 40 分钟前   ❤️ 1
    不懂就问,新的编程语言 vibe coding 效果咋样
    weiwenhao
        3
    weiwenhao  
    OP
       18 小时 35 分钟前
    @zhanying 基于类似 CLAUDE.md 这样的提示词可以达到不错的效果,但是如果是三方库的话,需要有一份 awesome 收集才行。另外就是语法简单,有强类型约束的话 AI 的正确率会更好。
    wweir
        4
    wweir  
       18 小时 31 分钟前   ❤️ 1
    gust
    go 的文件头 + rust 的语法习惯
    cmos
        5
    cmos  
       18 小时 28 分钟前   ❤️ 1
    从易用性和方便尝鲜的角度来看,我觉得可以实现一个类似 rust 的安装命令(安装在用户目录而不是系统目录),并考虑借鉴 cargo 的功能,填充 Golang 的实用性和 rust cargo 易用性之间的空白区域。
    wfhtqp
        6
    wfhtqp  
       18 小时 28 分钟前   ❤️ 2
    golang 也有被当作对手的一天
    weiwenhao
        7
    weiwenhao  
    OP
       18 小时 25 分钟前
    @cmos 很有道理,后续如果实现 install.sh 的话就默认安装在用户目录。
    weiwenhao
        8
    weiwenhao  
    OP
       18 小时 13 分钟前
    @wfhtqp 我一时都没有理解,这句话指的是 golang 这么强也能当做对手,还是指的 golang 这么弱也配当做对手 😄
    NoobPhper
        9
    NoobPhper  
       18 小时 4 分钟前
    文档字体好看 是叫啥
    weiwenhao
        10
    weiwenhao  
    OP
       17 小时 58 分钟前
    @NoobPhper Operator Mono 或者 IBM Plex Mono
    Donahue
        11
    Donahue  
       14 小时 48 分钟前   ❤️ 1
    大佬 太强了
    xiuming
        12
    xiuming  
       14 小时 24 分钟前   ❤️ 1
    @weiwenhao #8 golang 是弱鸡都还要从 php 和 java 那里抢份额
    dog82
        13
    dog82  
       14 小时 23 分钟前   ❤️ 1
    用 go 好几年,我依然钟爱 java
    linky6565
        14
    linky6565  
       14 小时 13 分钟前   ❤️ 1
    早期版本就能做到性能如此优秀的确了不起
    hutoer
        15
    hutoer  
       14 小时 11 分钟前   ❤️ 1
    语法比垃圾 Golang 好,预祝能火起来
    gggggggg
        16
    gggggggg  
       13 小时 55 分钟前   ❤️ 1
    为什么所有语言都想来和 golang 比一下?
    gggggggg
        17
    gggggggg  
       13 小时 52 分钟前   ❤️ 1
    @gggggggg 收回我刚说的话,nature-lang 还是一个国内大佬写的?那要支持下。
    fregie
        18
    fregie  
       13 小时 45 分钟前   ❤️ 1
    我想问一下,这个语言,主要适用于什么场景,或者解决了什么问题呢?
    brucedone
        19
    brucedone  
       13 小时 41 分钟前   ❤️ 1
    像 rust ,又像 go ,算是二者的中间集?
    coefu
        20
    coefu  
       13 小时 37 分钟前   ❤️ 1
    屌爆了,相当得劲儿。
    weiwenhao
        21
    weiwenhao  
    OP
       13 小时 28 分钟前
    @gggggggg 感谢支持。我就是作者,我应该加上开源自荐这个前缀哈哈
    irrigate2554
        22
    irrigate2554  
       13 小时 26 分钟前   ❤️ 1
    感觉像是一个加了 gc 和协程的 rust
    weiwenhao
        23
    weiwenhao  
    OP
       13 小时 4 分钟前
    @fregie @brucedone nature 主要是受到了 golang 的启发而开发的编程语言,并且改进了 golang 的一些痛点,包括语法、错误处理、包管理、interface{}、内存安全、cgo 等等。

    而定位上是 golang <--> java/php 之间,语法上有着更好的表达性,并且注重内存安全,所以比 golang 更加适合业务开发,比如 API 、Agent 、云原生等服务端领域开发。

    nature 也继承了 golang 的优点,原生支持并发原语 go+select+channel ,在高并发 IO 应用上有着非常优秀的表现。所以 nature 同样可以用于网络中间件,IOT ,command 等领域开发。

    当然这仅仅是现阶段展现出来的能力,nature 有着完全自研的编译器、汇编器、链接器、运行时,所以可以根据架构和技术发展进行高度定制,nature 下一阶段期望能够探索更多的可能性,能够进行超高性能需求的场景开发,比如操作系统,游戏引擎,GUI ,数据库等。
    whyso
        24
    whyso  
       12 小时 58 分钟前   ❤️ 1
    大佬有了解过 vlang 吗? nature 和 vlang 比怎么样?
    5261
        25
    5261  
       12 小时 54 分钟前   ❤️ 1
    让子弹飞一会先!
    weiwenhao
        26
    weiwenhao  
    OP
       12 小时 40 分钟前
    @whyso vlang 完全继承了 golang 语法,然后正在朝 rust 发展,希望能够开发底层系统,作者好像也在开发操作系统。golang 的协程,GC 之类的在 vlang 中基本就是抛弃的状态。总结来说 vlang 就是 golang 语法 + rust 的内核。

    nature 虽然是受到了 golang 的启发,但是抛弃了 golang 的语法进行重新设计,继承了 golang 的协程,GC 等 runtime 设计,并且进行了相当可观的改进,从性能测试就可以看出来。

    这样一说你应该能感觉到区别是蛮大的。
    irrigate2554
        27
    irrigate2554  
       12 小时 3 分钟前
    大佬加油,是我想要的语言没错,但是现在看上去生态还有些简陋,希望有一天能用上。
    x1aoYao
        28
    x1aoYao  
       11 小时 19 分钟前
    大佬厉害。Go 除了丑,最不满意的就是 CGO 太拉了。
    可以问几个问题么,Natrue 纯协作式的会有协程饥饿问题吗,似乎相对于无栈协程只是避免了函数染色?
    GC 是移动整理式的吗?
    weiwenhao
        29
    weiwenhao  
    OP
       11 小时 12 分钟前
    @x1aoYao 有 safepoint 就也不算纯协作,但是插入的 safepoint 不算多,只是在函数开始时插入了。如果是 for 循环,循环里面也没有函数调用的纯计算就会有饥饿问题,当然也会有 GC 问题。对比过 rust 的协程,性能上确实是无栈协程性能更好一些。

    GC 是 mark-sweep 模式的。
    whyso
        30
    whyso  
       10 小时 52 分钟前
    @weiwenhao 感谢大佬解答
    liuliuliuliu
        31
    liuliuliuliu  
    PRO
       10 小时 45 分钟前   ❤️ 1
    kanakana
        32
    kanakana  
       9 小时 51 分钟前 via Android
    > Golang 采用了抢占式调度,不需要关注 GC safepoint ,但仍需要关注协程栈是否需要扩容。

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

    好奇问几个问题。从 Go 的源码注释 [1] 看来,Golang 还是有 safe-point 的,这里的“不需要关注”具体是指什么?如果 Go 用 safepoint 切协程的话是不是就与 Nature 比较相像了?

    另外,Go “关注协程栈是否需要扩容”的另一个理由是:不同携程需要的栈大小不同,通过动态扩容我们可以先分配小的栈,再给需要的携程分配大号栈,从而节省内存。Nature 是怎么处理的?会有栈溢出吗?

    [1] https://go.dev/src/runtime/preempt.go
    chennqqi
        33
    chennqqi  
       9 小时 39 分钟前
    @liuliuliuliu go/rust 没有开 SIMD 啊
    supuwoerc
        34
    supuwoerc  
       9 小时 35 分钟前
    大佬太牛了
    weiwenhao
        35
    weiwenhao  
    OP
       8 小时 46 分钟前   ❤️ 1
    @kanakana golang 注释里的 safepoint 应该是用来辅助抢占式调度的判断,我在 fib 的汇编里面没有看到 safepoint 的相关逻辑,应该只是在特定的代码中出现。

    golang 即使分配最小的独立栈也是有 2KB ,所以难以节省内存。nature 每个 processor 一个栈,比如在 8 核 cpu 上一共就 8 个大的栈,每个栈都是 8M 大小。协程切换时将协程中的寄存器信息 copy 到这个大栈上就行,切出时将使用的栈按照精确使用大小切回到协程的存储空间中。
    liuliuliuliu
        36
    liuliuliuliu  
    PRO
       8 小时 41 分钟前
    @chennqqi rust nightly 就是 simd 的,go 好像是没有
    BALDOOR
        37
    BALDOOR  
       8 小时 39 分钟前
    看了眼,意义不大,直接跟 Go 竞争,开发效率没有质的差距,用 Go 的人也不会扣那点性能。
    生态这个更是不可能有,除非有大公司推动。
    Go 的“成功”其实很偶然,不值得参考。
    《定位上是 golang <--> java/php 之间》
    我觉得是位置很小甚至几乎没有空间了。
    找准自己的生态位很重要。
    像那个 MoonBit ,定位 WASM 语言,很少或者没有人去专门用一门语言去写。
    事实是应该这样做,但实际上不会,哪怕是我,我也不会这样做。
    我觉得未来语言会朝着 DSL 方向去,而不是 GPPL ,做一个事情,用一个合适的语言或者解决方案。
    而不是做什么上来就是 Java(调侃)。
    lixuda
        38
    lixuda  
       7 小时 48 分钟前
    作者牛,就是生态怎么办,这个还是要多宣传宣传
    weiwenhao
        39
    weiwenhao  
    OP
       7 小时 30 分钟前
    @lixuda 是要多宣传宣传,慢慢来总会有的,nature 可以接受 AI 贡献,只要 review 到位就行。
    K753255157
        40
    K753255157  
       6 小时 52 分钟前
    建议标准库增加 Map 、Filter 、Reduce 函数能极大提升开发体验
    weiwenhao
        41
    weiwenhao  
    OP
       4 小时 53 分钟前
    @BALDOOR 实际上这个位置就是 golang+java+php+node.js 的总和中非常大的一部分中 nature 会是更好的选择。
    kamahi
        42
    kamahi  
       1 小时 46 分钟前 via Android
    或许有一天,可以看到:

    science vs rust
    cell vs java

    🤣🧐🤡
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   916 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 20:59 · PVG 04:59 · LAX 12:59 · JFK 15:59
    ♥ Do have faith in what you're doing.