• Github 中文镜像
Sign inSign up
Watch966
Star102.4k
Fork61.8k
Tag: rust
Switch branches/tags
Branches
Tags
K / JavaScript Python Lua Wren 性能对比测试.md
移动浏览 Clone
加载中...
到移动设备上浏览
100 lines 5.14 KB
First commit on 16 Oct 2022
    • 去年找嵌入式脚本语言,做了一次 Python Lua Rhai 性能对比测试,选了 Lua。但 Lua 的索引是从 1 开始的,而绑定 Rust 函数都是从 0 开始的,转换或不转心智负担都很重,这几天又找了找脚本语言。

    有 Rust 绑定库的脚本语言不多,即使有绑定也都很久没有维护了,看了半天能用的只有一个 Wren

    顺手测了下 JavaScript 的,在火狐浏览器里。

    测试

    Wren 测试是下载官网的 Wren 0.4.0 cli 二进制包。

    没必要跟 Rust 比了,只跟纯 Lua 和 Python 实现比,Lua 和 Python 的代码依然用的是去年的。另一台电脑测的,所以重新跑测了下作为参考,依然是节能模式跑 3 次,每次循环 5 次 fibonacci(32)。这台电脑平时编译 Rust 比那一台的快,但是跑 Fibonacci 还变慢了……

    我看 Wren 的数字类型只是一个双精度浮点数,没有整数类型,而 Lua 从 5.3 开始是支持整型的,所以测完 Lua 的斐波那契我还在数字后面都加了个 .0 试了下,没有区别。

    代码

    • JavaScript 测试代码:

      function fib(n) {
          if (n < 2) {
              return n;
          }
          return fib(n - 2) + fib(n - 1);
      }
      var start = Date.now();
      for (i=0; i<5; i++) {
          fib(32);
      }
      console.log("elapsed:", Date.now() - start);
      
    • Wren 测试代码版本一:

      class Fib {
          static get(n) {
              if (n < 2) return n
              return get(n - 1) + get(n - 2)
          }
      }
      
      var start = System.clock
      for (i in 1..5) {
          Fib.get(32)
      }
      System.print("elapsed: %(System.clock - start)")
      
    • Wren 测试代码版本二:

      var Fib = Fn.new {|n|
          if (n < 2) return n
          return Fib.call(n - 1) + Fib.call(n - 2)
      }
      
      var start = System.clock
      for (i in 1..5) {
          Fib.call(32)
      }
      System.print("elapsed: %(System.clock - start)")
      

    结果

    • Wren:版本一
      elapsed: 3.411
      elapsed: 3.551
      elapsed: 3.401
      
    • Wren:版本二
      elapsed: 3.561
      elapsed: 3.547
      elapsed: 3.537
      
    • Lua:官网下的 lua54.exe,基于 Lua 5.4.4。
      elapsed: 1.688000
      elapsed: 1.666000
      elapsed: 1.532000
      
    • Lua:去年对比之后,我自己封装的 Lua 集成环境,也是 Lua 5.4 版本,但发布版本号没注意。
      elapsed: 2.189000
      elapsed: 2.089000
      elapsed: 2.027000
      
    • Python:官方 3.9.5
      elapsed: 4.375
      elapsed: 4.296875
      elapsed: 4.40625
      
    • JavaScript:火狐浏览器,单位是毫秒。
      elapsed: 8989
      elapsed: 8987
      elapsed: 8994
      

    结论

    封装之后即使运行纯 Lua 代码也会有性能损失。

    Wren 官网上的 Performance 章节显示 Wren 跑斐波那契数列的的性能高于 Lua 5.2.3,但我实测 Wren 0.4.0 的性能介于 Lua 5.4 和 Python 3.9 之间。

    老老实实用 Lua。