脚本语言
本插件采用两种脚本语言,分别是基于 Nashorn 的 JavaScript,和 Groovy,使用者可以自由选择,甚至是相互调用
信息
插件中的高级扩展功能只能通过 Groovy 实现,Groovy 要强大很多
语言区别
JavaScript 依赖其他框架,并非传统字节码,不是原生 JVM 语言,但更容易上手
Groovy 是标准的 JVM 语言,和 Java 看上去很像,可以无缝调用 Java 类、继承、异常、泛型等,且支持一些 Java 没有的语法糖,但是我觉得这个语言有些设计非常邪门(所以学习成本略高)
Groovy 才是真是的 Java Script(直译)!
性能对比
在 Oracle OpenJDK 1.8.0_381 环境下,执行 每轮 1,000,000 次整数累加,以原生 Java 性能为基准(100%),5 次运行结果如下:
| 轮数 | Groovy (动态) | Groovy (静态) | Nashorn (预编译) | Nashorn |
|---|---|---|---|---|
| 10 轮 | 2% 左右 | 91% ~ 96% | 46% ~ 58% | 48% ~ 59% |
| 30 轮 | 2% 左右 | 84% ~ 95% | 46% 左右 | 49% 左右 |
| 100 轮 | 2% 左右 | 92% ~ 97% | 46% 左右 | 49% 左右 |
| 1000 轮 | 2% 左右 | 96% ~ 99% | 48% 左右 | 50% 左右 |
提示
所有引擎均经过 20 轮统一预热,测试代码均为独立方法,确保 JIT 优化条件公平。
⚠️ 本测试仅包含简单整数累加,不代表复杂业务性能。
Groovy (动态) 性能极差,严禁用于性能敏感场景。
Groovy 动态和静态的编写
加一个 @groovy.transform.CompileStatic 即可表示为静态
groovy
import groovy.transform.CompileStatic //注意需要导入
@CompileStatic
class Test {
...
}不加则是动态
groovy
class Test {
...
}已知BUG
Nashorn 可能存在不可修复的内存泄露问题,具体表现为越重载越卡,不重载则没问题
Groovy 在高版本 Bukkit 中使用 CommandSender#sendMessage(String message) 时无法编译,推测是高版本 Bukkit API 使用了更加复杂的泛型等复杂机制导致 Groovy 无法检测参数类型,可去掉 @CompileStatic 或使用 "${''}原字符串" 解决。
