10 | JIT编译器的死穴:为什么要避免使用 NYI ?
10 | JIT编译器的死穴:为什么要避免使用 NYI ?
讲述:温铭
时长12:39大小11.56M
什么是 NYI?
NYI 的替代方案
1.string.gsub() 函数
2.string.find() 函数
3.unpack() 函数
4.pairs() 函数
如何检测 NYI?
写在最后
赞 4
提建议
精选留言(23)
- 鱼2019-06-17对于一个OpenResty入门者一开始讲这些性能和低层的知识有些枯燥了,毕竟还没写过几个OpenResty的实例,对性能的差异没什么感觉,基础知识还没掌握全更难深入底层。有如学习java的初学者一开始就看《Java编程思想》。可否尝试在后面的实际例子中引出这些知识点。
作者回复: 后面会专门介绍 OpenResty 的 Lua API。LuaJIT 的这些内容有个印象即可。
17 - HelloBug2019-06-17封装字符串查找函数: local function new_string_find(src, dst, regex, pos) if regex then local ctx = {pos = pos or 1} return ngx.re.find(src, dst, "jo", ctx) else local pos = pos or 1 return string.find(src, dst, pos, true) end end展开9
- 燕羽阳2019-06-171. lua的语法比较简单,如果有编程基础的话,一天就可以入门了。推荐大家两本书《lua程序设计》lua入门必备,《lua设计与实现》深入解释器虚拟机的原理。 2. 之前写过一点openresty和kong,但是从没注意过性能问题。今天的NYI,老师讲的非常棒,完整的实战方案,超赞👍 3.我对jit完全不熟悉,请问老师,jit是按照函数为单位来编译么?函数中有一个NYI,整个函数就是解释运行么?展开
作者回复: 是按照原语来编译的,也就是 `ipairs` 、`string.find` 这种的颗粒度,并不是你自己写的 function
共 2 条评论6 - geekYang2020-10-15老师,NYI 的替代方案为什么不去看 lua-resty-core,而要在lua-nginx-module中寻找? ngx.re.gsub 为什么即可以pcre编译,也可以luajit 编译?3
- helloworld2019-06-17老师,下面这个设置lua库的搜索路径的代码,最后为什么要拼接package.path本身啊? package.path = "../myLuaTest/myLuaCode/?.lua;"..package.path
作者回复: package.path 是默认的查找路径,你可以单独把它 print 出来看下里面的值。不拼接的话,就把默认查找路径全都覆盖掉了。
3 - Geek_89bbab2019-06-17希望老师分享一下写 openresty代码时用什么编辑器比较好,代码补全,定义跳转,引用跳转等如何配置。老师你们写openresty的时候是怎么来做的?直接vim操作,还是有更智能些的IDE?
作者回复: 现在还没啥好用的编辑器,我用的是 vs code
3 - Geek_2b5c152022-01-14Accroding from the new NYI list, the paris have been implement.3
- NEVER SETTLE2019-06-19经常会发现openresty运行一段时间,性能会差很多。然后reload一下性能会好很多。这个问题一直困扰很久了,不知道如何进行排查。 以前两天的情况,高峰期CPU使用率超过了60%,然后reload一下,CPU使用率就降为30%。
作者回复: 需要用火焰图分析下 on-cpu 才行
2 - Forturn2019-06-17楼上说的有道理,目前还没掌握基本的语法,还不会写一些基本的功能,就去学底层的东西,有点摸不着头脑,也不懂这些。不知道后面会不会具体事例
作者回复: 看不懂没有关系,重要的是记得有LuaJIT 和 NYI 这个东西,后面遇到问题方便查找。
2 - MiaoVictor2021-05-07老师,请问在查看NYI列表是,某些原语后是“2.1 stitch”,这个stitch是什么意思呢?1
- KoALa2019-07-25教程中反复提到了“LuaJIT 的作者目前处于半退休状态”,感觉这个情况很不乐观啊...
作者回复: Kong 和 OpenResty 的团队中,都有人在逐步接手。开源项目只要有人在使用,就不会死掉,不用担心。
1 - 莫然2019-07-11pairs的例子稍作修改,如下: local t = {} for i=1,100 do t[i] = i end for j=1,10 do for k,v in pairs(t) do -- end end jit.log里输出的是:[TRACE 1 t.lua:123 loop] 如果改成如下代码: for j=1,100 do for k,v in pairs(t) do -- end end jit.log里输出的是: [TRACE 1 t.lua:123 loop] [TRACE --- t.lua:128 -- NYI: bytecode 72 at t.lua:129] [TRACE --- t.lua:128 -- NYI: bytecode 72 at t.lua:129] 为什么循环10的时候没有NYI的提示?展开
作者回复: LuaJIT 的优化是随机触发的,要足够热才可能尝试去优化
1 - John2019-06-18老师,我在用op实现一个自定义逻辑的风控系统,想请教一下动态配置生效的问题,如何在不reload的情况下使配置生效,我想了两个办法:1,使用全局变量存储配置文件,提供一个api更新全局变量;2,使用ngx.shared.DICT,将配置文件存储在共享内存中。请问是否合理,或者是否有其它思路
作者回复: 你可以使用一个 timer,定时的查询是否有新的配置,并把新配置写到类似 shared dict 的缓存中。
共 2 条评论1 - 涉蓝2019-06-17对于初学者是不是 要先学 lua -> luajit -> openresty api -> 其他第三方包 按这种先把 文档啥的都扒一遍才行呢? 我对于使用有点疑惑,openresty可以做 网站普通后端语言可以做的事 譬如连数据库做前端页面 但这显然并不是它主要适合的部分吧 毕竟其他后端语言一大把,文档生态库好的多的是 所以是API 网关的 开发 或者 nginx 无法配置热修改的 补充吗?展开
作者回复: 这个问题其实要回到 OpenResty 诞生的那个时候来看, 2007 年,支持同步非阻塞的语言凤毛麟角。 即使是现在,后端语言可以达到 OpenResty 这种性能级别的也不多。 API 网关和软 WAF 算是开发者的自然选择,OpenResty 其实能做的不止这些。
1 - John2019-06-17请教一下老师,当op中的lua规则和nginx配置文件产生冲突,比如nginx配置了rewrite规则,又同时引用了rewrite_by_lua_file,那么这两条规则的优先级是什么?
作者回复: 这个具体要看 nginx 配置的 rewrite 规则是怎么写的了,是 break 还是 last。这个在官方文档中有注明,并且配了一个示例代码: location /foo { rewrite ^ /bar; rewrite_by_lua 'ngx.exit(503)'; } location /bar { ... } 上面这个配置中,ngx.exit(503) 是不会被执行的。但是,如果改成: rewrite ^ /bar break; ngx.exit(503) 就是可以执行的。
共 2 条评论1 - skrbug2023-01-29 来自北京LuaJit 的NYI,官网链接失效了老师
- 张靳2022-02-02老师,我想问下,如果是一个完整的API网关,里面写了很多的lua模块,如何比较简单快速的排查NYI?
- 沈康2020-09-25老师讲的非常好,做技术就要深挖底层原理,而且目前讲的也没有到底层 小白就知道急功近利,我只能说项目有问题谁来背锅?
- Geek_e593032019-11-12什么是代码热路径啊
- sheng2019-08-09这里的一个数量级是指十倍的意思么?
作者回复: 是的