go 执行js代码引擎系列总结篇:比较goja、otto、v8go


写在前面

本文是《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

参考

[1]在go中执行 javascript 代码


文章作者: Alex
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Alex !
  目录