Skip to content
On this page

凹语言执行速度比Go快一倍


凹语言还在开发状态的v0.17.0版本针对后端输出的wat文件做了体积优化。以递归版本的Fib为例,输出的体积是Go的百分之一(优化后是体积是前个版本的三分之一),执行速度快一倍。详细请参考凹语言主库下的 tests/bench/fib 目录文档。

Fib 测试代码

凹语言的优点可以通过一个简单的 Fibonacci 示例来说明。下面是凹语言和Go两种语言中实现的 fib 函数。

凹语言代码:

wa
func init {
	println(fib(46))
}

func fib(n: int) => int {
	aux: func(n, acc1, acc2: int) => int
	aux = func(n, acc1, acc2: int) => int {
		switch n {
		case 0:
			return acc1
		case 1:
			return acc2
		default:
			return aux(n-1, acc2, acc1+acc2)
		}
	}
	return aux(n, 0, 1)
}

Go 代码:

go
package main

func main() {
	println(fib(46))
}
func fib(n int) int {
	var aux func(n, acc1, acc2 int) int
	aux = func(n, acc1, acc2 int) int {
		switch n {
		case 0:
			return acc1
		case 1:
			return acc2
		default:
			return aux(n-1, acc2, acc1+acc2)
		}
	}
	return aux(n, 0, 1)
}

测试结果

执行 make 输出结果如下:

$ make
wa -v
Wa version v0.17.0

go version
go version go1.21.0 darwin/amd64

wasmer -V
wasmer 4.3.7

wa build -optimize -target=wasi -output=fib_wa.wasm fib_wa.wa
GOOS=wasip1 GOARCH=wasm go build -o fib_go.wasm

du -sh fib_*.wasm
1.3M    fib_go.wasm
 12K    fib_wa.wasm

time wasmer fib_wa.wasm
1836311903
    0.12 real         0.02 user         0.03 sys
time wasmer fib_go.wasm
1836311903
    0.26 real         0.04 user         0.05 sys

和 TinyGo 的对比

TinyGo 是 0.33.0 版本,编译时关闭了不必要的特性。

$ make tinygo
time tinygo build --target wasm -o fib_tinygo.wasm -scheduler none --no-debug fib_go.go
        0.95 real         0.89 user         0.20 sys
time wa build -optimize -target=wasi -output=fib_wa.wasm fib_wa.wa
        0.08 real         0.06 user         0.01 sys
wasm2wat fib_tinygo.wasm -o fib_tinygo.wat
du -sh fib_*.wasm
1.3M    fib_go.wasm
8.0K    fib_tinygo.wasm
8.0K    fib_wa.wasm
time wasmer fib_wa.wasm
1836311903
        0.03 real         0.01 user         0.01 sys
time wasmer fib_tinygo.wasm
1836311903
        0.02 real         0.01 user         0.01 sys

凹语言编译速度是TinyGo的10倍,输出的wasm体积和TinyGo一样都是8KB,凹语言输出的wasm执行时间比TinyGo稍慢。

总结

  • 凹语言是 v0.17.0 版本, Go 是 1.21.0 版本
  • 凹语言输出的wasm体积为 12KB, Go 语言输出 1.3MB 大小的 wasm, 凹语言是Go的1/100大小(优化后是体积是前个版本的三分之一)
  • 凹语言执行时间 0.12, Go 的执行时间是 0.26, 凹语言是Go的1/2执行时间