什么是NYI?
这就牵扯到lua代码运行时的过程,在openresty启动的过程中国,master进程会fork出worker进程,同时,master进程内的luajit虚拟机也会一同fork到worker中,在同一个worker内的所有协程,都会共享这个虚拟机,lua的代码执行也是在这个虚拟机中完成。
标准的lua编译器,在lua代码执行时,是先由lua编译器编译为字节码(byte code),然后再由lua虚拟机执行,而luajit在lua的基础上,还有一个直接生成机器代码的jit编译器,当luajit解释器认为lua的函数或者循环执行次数足够热时,便会除非jit编译器。
引用温铭老师的一句话,所谓的luajit性能优化,本质上就是尽可能的让lua代码被jit编译器生成机器码,而不是回退到lua解释器解释执行的模式。
而jit编译器不支持的原语,就是NYI(Not Yet Implemented),lua的官网上也有NYI的列表,我们在使用的时候也可以去对照这个列表。
NYI的替代方案
当我们在使用一个函数时,不妨优先使用openresty的API,其次使用luajit的函数库,最后再考虑使用lua的函数库
怎么检测NYI?
luajit自带的jit.dump 和 jit.v 都可以打印出jit编译器工作的过程。通常,我们可以使用者两个工具来验证是否可以被jit。使用方法:
resty -j -v -e "for i=1, 1000 do
end"
循环的目的是为了让代码足够热,触发jit编译