深入 Lua Garbage Collector(四)
早期的 Lua GC 采用的是 stop the world 的实现。一旦发生 gc 就需要等待整个 gc 流程走完。如果你用 lua 处理较少量数据,或是数据增删不频繁,这样做不是问题。但当处理的数据量变大时,对于实时性要求较高的应用,比如网络游戏服务器,这个代价则是不可忽略的。lua 本身是个很精简的系统,但不代表处理的数据量也一定很小。
从 Lua 5.1 开始,GC 的实现改为分步的。虽然依旧是 stop the world ,但是,每个步骤都可以分阶段执行。这样,每次停顿的时间较小。随之,这部分的代码也相对复杂了。分步执行最关键的问题是需要解决在 GC 的步骤之间,如果数据关联的状态发生了变化,如果保证 GC 的正确性。GC 的分步执行相对于一次执行完,总的时间开销的差别并不是零代价的。只是在实现上,要尽量让额外增加的代价较小。
GC流程先来看 GC 流程的划分。
lua 的 GC 分为八个阶段。GC 处于哪个阶段(代码中被称为状态),依据的是 global_State 中的 gcstate 域。状态以宏形式定义在 lgc.h 的 39 行:
123456789101 ...
(译)tolua参考手册
文章目录
</div>
<p>项目使用Cocos2dx+lua框架做的,用到luabinding实现C++代码绑定到lua层使用,所以学习一下tolua++工具的原理和使用,在这做个记录。</p>
tolua++是tolua的扩展版本,是一款能够集成C/C++与lua代码的工具。在面向C++方面,tolua++包含了一些新的特性比如:
支持std::string作为基本类型(这个可以由一个命令行选项关闭)
支持类模板
tolua这款工具,极大的简化了C/C++代码与lua代码的集成。基于一个干净的头文件(或者从实际头文件中提取),tolua会自动生成从lua访问C/C++功能的绑定代码。使用Lua API和标记方法设施,tolua解析C/C++常数,外部变量、函数、类和方法绑定到Lua。
官网官网文档
tolua如何工作 (How tolua works)使用tolua,我们需要创建一个package文件(译者注:pkg文件),即一个从C/C++实际头文件整理后的头文件,列举出我们想导出到 ...
lua
基本使用
* 行注释用--
* 数组和字典都是table,数组下标不是从0开始的,而是从1开始的
* 函数调用只有一个参数,并且这个参数是字符串字面量或者table构造器时,可以省略括号
* unpack函数最重要的使用场景就是generic call,即函数的动态参数调用
* 函数的多值返回。lua会根据调用场景来调整返回的结果数量
1. 当函数调用作为一个语句时,忽略所有的结果
2. 当函数调用作为一个表达式时,只保留第一个返回结果
3. 只有当函数调用在一个表达式列表中是最后一个表达式时,我们会得到所有的返回值。这种表达式
列表出现在4种结构中:mutiple assignment, arguments to function calls, table
constructors, and return statements
常用操作
table.concat(array, ',') --连接,相当于join
table.insert(array, 1, 15) --添加元素,在位置1处添加15。若不带位置参数,则默认添加到最后
ta ...
Lua学习笔记
两个减号是单行注释:1-- 注释内容
多行注释:1234--[[ 注释内容注释内容--]]
数据类型Lua是动态类型语言,变量不要类型定义,只需要为变量赋值。值可以存储在变量中,作为参数传递或结果返回。
nil这个最简单,只有值nil属于该类,表示一个无效值(在条件表达式中相当于false)。
boolean包含两个值:false和true。
number表示双精度类型的实浮点数
string字符串由一对双引号或单引号或[[和]]间的一串字符来表示
function由 C 或 Lua 编写的函数
userdata表示任意存储在变量中的C数据结构
thread表示执行的独立线路,用于执行协同程序
tableLua 中的表(table)其实是一个”关联数组”(associative arrays),数组的索引可以是数字或者是字符串。在 Lua 里,table 的创建是通过”构造表达式”来完成,最简单构造表达式是{},用来创建一个空表。对 table 的索引使用方括号 []。Lua 也提供了 . 操作。1234567t[i]t.i -- 当索引为字符串类型 ...
利用 nginx_lua 定制高效灵活的专属WAF
0x01 什么是Lua123关于Lua,就不用多说了吧,想必朋友们应该也都非常熟悉了,众多脚本语言中的一种,不过相对于其它脚本来说,性能要略高一点在nginx中也提供了一个nginx_lua的模块,主要是为了方便用户,可以灵活的通过lua来扩展nginx功能,比如lua_waf有兴趣可自行深入了解,这里就不细说了,我们今天的重点主要还是想利用它来快速部署一个简易版的Waf
0x02 这里,我还是拿之前已经编译好的lnmp环境来演示,因为等会儿要重新编译nginx,所以就直接把之前nginx的整个安装目录干掉,因为是源码编译安装的,所以也不会有啥残留[源码编译安装的好处],记得在干掉之前先把nginx服务停掉,配置文件[nginx.conf]也备份一下,方便等会儿再直接拿过来用1php5.5.38 + mysql-5.5.32 + nginx-1.12.1 + centOS6.8_x64
1234 pkill nginx netstat -tulnp | grep "80" cp /usr/local/nginx/conf/nginx.conf /root/ cp /us ...
基于OpenResty安装配置Nginx+LUA并实现请求分发的双层Nginx架构策略
台CentOS6.x192.168.1.210192.168.1.211192.168.1.212网络拓扑210和211作为应用层web服务器212作为网络请求分发代理服务器
Step1:安装Linux依赖1yum install -y readline-devel pcre-devel openssl-devel gcc
Step2:安装Nginx Openresty12345678910111213141516171819wget http://openresty.org/download/ngx_openresty-1.7.7.2.tar.gz tar -xzvf ngx_openresty-1.7.7.2.tar.gz cd /usr/servers/ngx_openresty-1.7.7.2/cd bundle/LuaJIT-2.1-20150120/ make clean && make && make install ln -sf luajit-2.1.0-alpha /usr/local/bin/luajitcd bundle ...
Lua学习笔记(3) 关于pairs和ipairs
[TOC]
pairs
遍历table
local tbTestPairs ={
[1] = 1,
nTest_1 = 2,
szTest = "test",
tbTest = {},
nTest_2,
}
for k, v in pairs(tbTestPairs) do
print (k, v)
end
结果
szTest test
tbTest table: 000000000033a630
nTest_1 2
ipairs
按顺序便利table
local tbTestIpairs = {1, 3, 5, nil, 7}
for k, v in ipairs(tbTestIpairs) do
print(k ,v)
end
结果
1 1
2 3
3 5
总结
pairs是无序的,ipairs是有序的。这点很重要,如果要按存储顺序处理表中内容的时候,pairs就可能得不到预期的结果;
ipairs遇到nil就停止打印,所以只打印出来前面三个,7没有打印出来
pairs中为 ...
Lua数据结构 — TString(二)
存储lua里面的字符串的TString数据结构:(lobject.h 196-207)
其它结构中也会有L_Umaxalign dummy这个东西,来看看L_Umaxaliagn:
从字面意思上就是保证内存能与最大长度的类型进行对齐,事实上也是做这件事,这里感觉lua想给各种不同设备做一种嵌入式脚本,这里要保证与最大的长度对齐能保证CPU运行高效不会罢工。
tsv才是TString的主要数据结构:
CommonHeader:这个是和GCObject能对应起来的GCheader
reserved:保留位
hash:每个字符串在创建的时候都会用有冲突的哈希算法获取哈希值以提高性能
len:字符串长度
哈希是lua里一个很重要的优化手段,具体的哈希算法相关知识在文章最后会补充说明一下,字符串的hast表放在L->l_G->strt中,这个成员的类型是stringtable,我们再来看看stringtable数据结构:(lstate.h 38-42)
stringtable结构很简单:
hash:一个GCObject的表,在这里其实是个TString*数组
nuse:已 ...
深入理解Lua中的元表setmetatable
一直对Lua中的元表理解的不是很深,今天刚好有时间重点看了一下这一部分,写一下笔记有利于日后翻阅
Lua中的表Lua是“万物基于表的”,Table既可以模拟数组,也可以模拟字典哈希表等,确实很强大。其实Lua表的本质就类似是我们C#中的字典,是以很多键值对存在的。如果访问了一个表中并不存在的一个元素时就会触发Lua中的一套查找机制,Lua中继承的模拟也是运用了这一机制。
元表元表像是一个“操作指南”,里面包含了一系列操作的解决方案,例如__index方法就是定义了这个表在索引失败的情况下该怎么办。
元方法 __indexindex可以指向一个元素,如果说元表是个指南针,那么index是指向的具体方位,如果只有指南针是不够的,你还是不知道具体的方位。例如把A设置成B的元表,如果不设置__index,想要用B去访问A中的方法时,返回的还是nil,例如下面的例子很好的证明了这一点。
123local A = {name = "zz"}tb = setmetatable({},A)print(tb.name)
这时候换种思路,指定A的元方法为自己:
1234loca ...
2000 HUB5 English Evaluation Transcripts语音数据集
提供者:杜成玉下载地址:https://catalog.ldc.upenn.edu/LDC2002S09
数据来源:https://www.zhihu.com/question/63383992/answer/222718972该数据集由NIST(国家标准与技术研究院)2000年发起的HUB5评估中使用的40个英语电话对话的成绩单组成,其仅包含英语的语音数据集,百度最近的论文《深度语音:扩展端对端语音识别》使用的是这个数据集。推荐应用方向:音乐、人声、车辆、乐器、室内等自然和人物声音识别。
相关论文[1]Hain T, Woodland P C, Evermann G, et al. New features in the CU-HTK system for transcription of conversational telephone speech[C]//Acoustics, Speech, and Signal Processing, 2001. Proceedings.(ICASSP’01). 2001 IEEE International Conference on. I ...