博文

目前显示的是 七月, 2024的博文

Programming in Lua First Edition

Part I · The Language 1 - Getting Started 1.1 Chunks 在lua命令中 -l 选项会调用 require 函数 e.g. prompt> lua -i -la -lb -i :Lua运行指定代码段后进入交互模式 另一个link外部代码段的方式是使用 dofile 函数 在调试/测试时使用 -i 和 dofile 非常方便 1.2 Global Variables 1.3 Some Lexical Conventions(词法约定) Lua大小写敏感 以下划线开头的大写字母标识符是Lua保留字的命名风格,因此要避免使用 1.4 The Stand-Alone Interpreter lua [options] [script [args]] -e: 直接将命令传入Lua(e.g. prompt> lua -e "print(math.sin(12))" ) -l: 使用require加载一个文件 -i: 进入交互模式 全局变量arg存放Lua的命令行参数,脚本名索引为0: prompt> lua -e "sin=math.sin" script a b args[-3] = "lua" args[-2] = "-e" args[-1] = "sin=math.sin" args[0] = "script" args[1] = "a" args[2] = "b" 2 - Types and Values Lua的8个基本类型:nil, boolean, number, string, userdata, function, thread, table type()以字符串形式输出参数的类型 2.1 Nil 2.2 Booleans 在控制结构的条件中,nil和false为假,其他值都为真 2.3 Numbers 表示实数。一般有个错误的看法 CPU 运算浮点数比整数慢。事实不是如此,用 实数代替整数不会有什么误差(除非数字大于 100,00...

Lua源码剖析

reference https://ty-chen.github.io/lua-linux/

Lua Gems

性能优化 关于性能优化的两条格言: 不要优化 还是不要优化(仅限专家) 不要在缺乏恰当度量( measurements )时试图去优化软件。编程老手和菜鸟之间的区别不是说老手更善于洞察程序的性能瓶颈,而是老手知道他们并不善于此。 做性能优化离不开度量。优化前度量,可知何处需要优化。优化后度量,可知「优化」是否确实改进了代码。 basic lua使用基于寄存器的虚拟机,用一个栈来存放它的寄存器。lua中每个active的函数都有一个activation record放在栈里,记录了这个函数使用的寄存器。因此,每个函数都有其自己的寄存器。由于每条指令只有 8 个 bit 用来指定寄存器,每个函数便可以使用多至 250 个寄存器。Lua 的寄存器如此之多,预编译时便能将所有的局部变量存到寄存器中。所以,在 Lua 中访问局部变量是很快的。 因此,可以是用局部变量提高性能。例如给多次引用的外部变量(e.g. tbl.data )赋予别名。但是这在 LuaJIT 上几乎已经没有了优势。 变量创建问题考虑比较跨域性能消耗和创建消耗:循环内创建简单变量比循环外创建多次覆写效率高;循环外创建长table比循环内创建效率高。 避免动态编译( loadfromstring() 等),可以使用闭包等来避免。 Short inline expressions can be faster than function calls. t[#t+1] = 0  is faster than  table.insert(t, 0) . table Lua 实现表的算法颇为巧妙。每个表包含两部分:数组(array)部分和哈希(hash)部分,数组部分保存的项(entry)以整数为键(key),从 1 到某个特定的 n,(稍后会讨论 n 是怎么计算的。)所有其他的项(包括整数键超出范围的)则保存在哈希部分。 顾名思义,哈希部分使用哈希算法来保存和查找键值。它使用的是开放寻址(open address)的表,意味着所有的项都直接存在哈希数组里。键值的主索引由哈希函数给出;如果发生冲突(两个键值哈希到相同的位置),这些键值就串成一个链表,链表的每个元素占用数组的一项。 当 Lua 想在表中插入一个新的键值而哈希数组已满时,Lua 会做...