当前位置: 首页 > news >正文

Lua5.4新特性

Lua5.4新特性

https://zhuanlan.zhihu.com/p/137588708

Lua5.4已经进入rc(Release Candidate)状态,相信很快就会发布正式版。这个版本在语言层面上修改的东西并不多,但是默认的GC被换成了“分代式GC”,这对于那些经常产生短期对象的程序应该会有很明显的性能提升。GC带来的负担永远是自动内存管理语言的一大痛点,如果能在这一点上取得突破,那肯定比提供更多语法糖来得有价值。

此外5.4可以指定局部变量的属性,用这样的语法:

local a <NAME> = 3

NAME可以是constclose,为const时表示const变量(const variables),const变量可以帮助编译器作一些优化,比如下面的代码:

local a <const> = 4
local b = a + 7
print(b)

编译器会把a消除掉,直接给b赋11。这种优化是有限的,对于基本类型和字符串,能够有效减少寄存器的访问,但对于table貌似益处不大。代码文件如果需要一些数值常量,可以写成const变量,比如:

local MAX_LEN <const> = 20
function check_name(name)
    return #name <= MAX_LEN
end

check_name中就没有upvalue的访问,而是直接转换成和20的比较。

close变量(To-be-closed Variables)需要和close元方法结合使用,在变量超出作用域时,会调用变量的close元方法,这听起来是不是有点像C++的RAII用法。下面是一个例子:

local function newlock()
    local lock = {
        acquire = function()
            print("acquire lock")
        end,
        release = function()
            print("release lock")
        end,
    }
    return lock
end

local function lockguard(lock)
    local wrap = {
        lock = lock
    }
    lock.acquire()
    return setmetatable(wrap, {__close = function(t, err)
        t.lock.release()
    end})
end

local lock = newlock()
do
    for i = 1, 3 do
        local l <close> = lockguard(lock)
        print(i)
        error("err")
    end
end

定义local l <close>后,无论是否有错误,release都能得到调用;从这个例子也可以看出,close变量一般用于需要及时释放资源的情况;否则Lua的GC可以应付大多数情况。

除了上面提到的特性,还有一些新的修改罗列如下:

  • userdata现在可以关联多个user值,C的API也有相应的修改,如果我们新建的userdata没有关联值,则尽量使用lua_newuserdatauv,这样更高效,lua_newuserdata仅仅为了兼容,且默认会关联1个值。
  • math.random使用了新的算法。
  • 协程库提供了新的APIcoroutine.closelua_resetthreadcoroutine.close只能在挂起或死亡状态下调用,挂起状态下会使用协程进入死亡状态,并且关闭所有的close变量。

其他修改请参考Lua文档:

  • http://www.lua.org/work/doc/
  • http://www.lua.org/work/doc/manual.html

编辑于 03-12

动态语言

Lua

 

 

 

 

 

 

 

 

 

 

 

相关文章:

  • 探究光线追踪技术及UE4的实现 -- good
  • Unity游戏项目性能优化总结
  • 【UE4源代码观察】观察DDC(DerivedDataCache)
  • Chrome 抓包
  • float.Parse 在不同区域小数表示是不一样的
  • C# GC 垃圾回收
  • Android Studio NDk调试(基于gradle-experimental插件与LLDB)
  • android studio调试c/c++代码
  • 在开发过程中使用 git rebase 还是 git merge,优缺点分别是什么?
  • Visual Studio 2019 远程调试工具(Remote Debugger)使用方法
  • Windbg使用说明书
  • 使用Windbg查看CrashDump
  • 【无标题】windbg 分析dump文件
  • Dump文件有三种:完整内存转储,内核内存转储,小内存转储。System Properties中的高级选项中可以看到这些设置。
  • Analysing crash dump in windbg
  • 230. Kth Smallest Element in a BST
  • DataBase in Android
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • gf框架之分页模块(五) - 自定义分页
  • leetcode讲解--894. All Possible Full Binary Trees
  • Spark学习笔记之相关记录
  • spring boot下thymeleaf全局静态变量配置
  • spring cloud gateway 源码解析(4)跨域问题处理
  • vue2.0项目引入element-ui
  • Vue学习第二天
  • 阿里云Kubernetes容器服务上体验Knative
  • 关于extract.autodesk.io的一些说明
  • 基于 Babel 的 npm 包最小化设置
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • 7行Python代码的人脸识别
  • 组复制官方翻译九、Group Replication Technical Details
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (3)llvm ir转换过程
  • (vue)页面文件上传获取:action地址
  • (八)Flask之app.route装饰器函数的参数
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (力扣题库)跳跃游戏II(c++)
  • (十)T检验-第一部分
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (四)Controller接口控制器详解(三)
  • (一)为什么要选择C++
  • (转)一些感悟
  • ..回顾17,展望18
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .Net FrameWork总结
  • .NET gRPC 和RESTful简单对比
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .net 程序发生了一个不可捕获的异常
  • .NET6 命令行启动及发布单个Exe文件
  • .net生成的类,跨工程调用显示注释
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?