写在前面
本文是《go执行js代码引擎系列》文章的总结,前面依次写了三篇文章
性能比较
package main_test
import (
"github.com/dop251/goja"
"github.com/robertkrimen/otto"
"go-js/common"
v8 "rogchap.com/v8go"
"testing"
)
func BenchmarkGoja(b *testing.B) {
vm := goja.New()
filePath := "data/add.js"
jsData, err := common.ReadFile(filePath)
if err != nil {
panic(err)
}
// 执行js代码
for i := 0; i < b.N; i++ {
_, err = vm.RunString(jsData)
if err != nil {
panic(err)
}
}
}
func BenchmarkOtto(b *testing.B) {
vm := otto.New()
filePath := "data/add.js"
jsData, err := common.ReadFile(filePath)
if err != nil {
panic(err)
}
// 执行js代码
for i := 0; i < b.N; i++ {
_, err = vm.Run(jsData)
if err != nil {
panic(err)
}
}
}
func BenchmarkV8go(b *testing.B) {
ctx := v8.NewContext()
filePath := "data/add.js"
jsData, err := common.ReadFile(filePath)
if err != nil {
panic(err)
}
// 执行js代码
for i := 0; i < b.N; i++ {
_, err = ctx.RunScript(jsData, "math.js")
if err != nil {
panic(err)
}
}
}
执行: go test -bench . -benchmem
输出:
goos: darwin
goarch: amd64
pkg: go-js
cpu: Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz
BenchmarkGoja-12 203094 5403 ns/op 3432 B/op 69 allocs/op
BenchmarkOtto-12 242108 4948 ns/op 2624 B/op 74 allocs/op
BenchmarkV8go-12 386238 3143 ns/op 56 B/op 4 allocs/op
PASS
ok go-js 6.897s
可见v8g0
性能强一些,耗时方面相差不大,主要是内存分配方面。每次执行分配内存大小相差两个数量级,分配内存次数相差一个数量级。
v8go
还能实现运行环境的继承和隔离,而不用每个运行环境都加载所有基础对象。推荐使用v8go
。