Lua循环优化 · 花生肉泥
关于大量字符串连接 (速度提升100倍)123456789101112131415161718a = os.clock()local s = ''for i=1,100000 do s = s .. 'a'endb = os.clock()print(b-a) -- 1.708秒a = os.clock()local s = ''local t = {}for i=1,100000 do t[#t+1] = 'a'ends = table.concat(t,'')b = os.clock()print(b-a) -- 0.011秒
关于创建大量小size的表(大概速度提升1倍)12345678910111213141516-- 创建大量小size表时,应该先填充好表的大小a = os.clock()for i=1,2000000 do local a = {} a[1] = 1;a[2] = 2;a[3] = 3endb = os.clock()print(b-a) ...
Lua脚本式编程
1.基本语法单行注释:–多行注释:–[[ 内容–]]
lua最好不要使用下划线加大字母的标识符,因为lua的保留字是这样的。lua不允许使用特殊字符如@$%来定义标志符。
默认情况下,变量总是认为全局。删除全局变量,只需要将变量赋值nil .
lua的数据类型:nil 、boolean、number、string、userdata、function、thread和table。
nil作为比较时应该加上双引号,例如
12type(x) == "nil"
boolean类型只有两个可选值:true 和 falselua把false和nil看作是“假”,其他都为真。
number(数字):lua只有一种number类型,double双精度类型,默认类型可以修改luaconf.h里面的定义。
string(字符串):由一对双引号或单引号来表示,也可以用2个方括号“[[ ]]”来表示“一块”字符串。
对一个数字字符串上进行算术操作时,lua会尝试将这个数字字符串转换成一个数字。
12print(“2”+6) 8.0print("2"+"6") ...
Goto in LuaJIT
Lua 在 5.2 之后的版本,加入了 goto 这个关键字,用来控制程序跳转到指定 label。我们可以利用这个特性,来模拟 continue 的实现。需要注意的是 goto 只能跳转到 label,而 ::name:: 的格式就可以设置一个 label。
for i=1,5 do
if i == 3 then
goto continue
end
print(i)
::continue::
end
这样就简单实现了 continue。但是有些同学可能会有疑问,这是 Lua 5.2 的特性,我们都知道 OR 中使用的 Lua 5.1,那如何使用?
其实我们只需要使用 LuaJIT 就可以解决这个问题了。在 LuaJIT 的主页上有这个介绍:
LuaJIT supports some language and library extensions from Lua 5.2. Features that are unlikely to break existing code are unconditionally enabled:
...
采访 Lua 发明人
<div class="entry">
<p id="fortitle"> 2012-12-03
转载云风的一篇文章
采访 Lua 发明人的一篇文章
《Masterminds of Programming: Conversations with the Creators of Major Programming Languages》是本相当不错的书。博文翻译出版了这本书,中文名叫做《编程之魂》。
书是好书,可惜翻译这本书需要对各种语言的深入研究,看起来译者有点力不从心。出版社打算重新做这本书。受编辑所托,我校对了其中第七章:有关 Lua 的一段。原文读下来拍案叫好。可惜译文许多地方看起来有些词不达意。许多在口语化交流中提到的术语被忽略了做了错误的翻译。有些部分应该是对 lua 理解不够而没能表达清楚。
仔细校对了两段后,我干脆放弃原译本,自己动手翻译了一份(保留了不到 1/4 原来的译文)。虽然个 ...
Lua 初步学习
1 所谓的“交互式编程” Lua提供了交互式编程模式,我们可以在命令行中输入程序并立即查看效果。 Lua 交互式编程模式可以通过命令 lua -i 或 lua 来启用
2 所谓的“脚本式编程” 我们将代码写入.lua文件,然后执行,就是脚本式编程。 eg: WangBingdeMacBook-Pro:~ wangbing$ cd /Users/wangbing/Desktop/luaDemo WangBingdeMacBook-Pro:luaDemo wangbing$ ls helloWord.lua WangBingdeMacBook-Pro:luaDemo wangbing$ lua helloWord.lua Hello World! WangBingdeMacBook-Pro:luaDemo wangbing$
3 如何进行代码注释 单行注释:– 兑行注释:–[=[注释内容]=]
4 标志符 1)Lua标志符用来定义一个变量,标志符是以A到Z或者a到z或者下划线_开头加上0个或者多个字母、下划线、数字等 2)但是最好不用 ...
AIX下编译64位Lua
</div>
<div class="pt-article-main">
<div class="panel panel-default">
<div class="panel-body">
<div class="pt-article-content">
<p>Lua是一个非常有名的脚本语言,是使用标准C编写而成的,目前官方提供了其在众多平台下的编译的<code class="highlighter-rouge">Makefile</code>文件 ...
Lua基础语法
注释
单行注释两个减号,--
多行注释--[[
内容
--]]
数据类型
Lua是动态类型语言,变量不需要类型定义,只需为变量赋值
数据类型
描述
nil
只有值”nil”属于该类,表示一个无效值(在条件表达式里相当于false)
boolean
false 和 true
number
双精度类型的实浮点数
string
由一对双引号" "或单引号' '表示
function
由C或Lua编写的函数
userdata
表示任意存储在变量中的C数据结构
thread
表示执行的独立线路
table
Lua 中的表(table)其实是一个”关联数组”(associative arrays),数组的索引可以是数字或者是字符串。在 Lua 里,table 的创建是通过”构造表达式”来完成,最简单构造表达式是{},用来创建一个空表。
nil
nil类型表示一种没有任何有效值,它只有一个值”nil”
对于全局变量和table,nil的另外一个作用为删除,给全局变量或table表里的变量赋值nil,等于把它们删掉b ...
Lua脚本语言入门代码
近来游戏基本做的差不多了,大约5月底左右可以内测?现在正在快马加鞭增强其脚本功能.考虑到效率和库大小,功能等原因,暂决定使用<魔兽世界>采用的Lua语言进行嵌入支持.5555,我可爱的Python和Ruby没被采用,怨念啊…下面是学习的一些代码,均在LuaEdit5.0上运行通过.
--> 实验类型
print( type("HelloWorld") );
print( type(10.4 * 3) );
print( type(print) );
print( type(type) );
print( type(true) );
print( type(nil) );
print( type(type(x)) );
print("-------------------------------")
--> 实现同一变量对应多种类型
print( type(a) )
a = 10
print( type(a) )
a = "a string!!"
print( type(a) ) ...
OpenResty Lua Stream实现分析
OpenResty(以下简称OR)是Lua应用的典范,其最大的亮点在于,使用Lua协程搭配上异步非阻塞的IO,这样开发者可以使用同步方式来编写代码,而底层IO调度、唤醒等操作留给C编写的引擎层。
实际上,使用类协程的技术,让异步操作同步化,已经有很多相关的技术了,比如腾讯的libco、百度的brpc都是自己在C层面实现了类协程的机制,不过这一类技术用的最广泛的还是OR。市面上分析OR内部实现的文章并不算很多,所以这段时间研究了一下OR的实现。
OR内部,其实是分7层HTTP的ngx_lua模块,以及四层TCP的lua_stream实现,两者在很多部分都很相近,以下分析以4层的lua_stream来解释,对应的版本是openresty-1.13.6.1和ngx_stream_lua-0.0.3的实现。
既然OR在这里选择了使用协程来将用户的异步操作同步化,那么实际上内部其实实现了一个简易版本的操作系统内核的“CPU调度”,其中一个一个的协程就是CPU调度单位,因此在这里分为几部分来分析:
维护协程的数据结构。
创建新协程的时候如何进行初始化?
协程调度算法?
如何将异步操作同步化?
...
Lua_Trace 1. Lua数据结构
<p>摘要:[Lua_Trace] 1. Lua数据结构 - TValue</p>
<br />
<p>
欲深入了解Lua,我认为先从数据结构开始是必要的,</p>
本文将由Lua基础数据结构(TValue)讲起, 进而衍生至TString, Table ⋯ 等。
此源码分析的版本为 : Lua 5.3.1
1. TValue : 基础数据
Lua中所有的数据结构都由TValue衍伸,以OO的概念来看它就有点像是基底类(abstract)般的存在着,因此采C语言来模拟,就是定义出一个通用的结构体作为”父类”,然后子类的结构体中以这个父类作为结构体的第一个成员变量。
//lobject.h
typedef struct lua_TValue TValue;
struct lua_TValue {
TValuefields;
};
/*
Tagged Values. This is t ...