Lua 5.1#运算符和字符串比较(性能)

为了这:

b = #{1,2,3}
c = 'deadbeef' == 'deadbabe'

b是以O(n)还是O(1)计算的?在什么情况下?行为是否一致,或者像稀疏数组行为一样依赖于上下文?
是字符串比较O(1)还是O(n)?我知道字符串是不可变的,Lua比较哈希值但是如果2个不同的字符串哈希到相同的值呢?
请不要回答“不要担心低级行为,儿子”.我对低级行为感兴趣.谢谢.

编辑

3)#的结果是存储在某个地方,还是每次我为同一个数组调用它时计算出来的?

解决方法

表的长度以O(log n)计算.算法大致如下:

>尝试通过采取步骤找到映射到nil的一些整数索引.步长每次加倍. (如果在数组部分的末尾找到nil值,则可以跳过此部分.)
>当找到这样的索引时,在该索引与最后一个已知的非零索引之间的间隔上使用分而治之算法,以找到一个非零值,后面跟一个nil值.

请参阅详细信息here.如果您具有连续的值序列,则此算法可以正常工作,但如果阵列之间有孔,则会产生意外结果.

编辑:内置#运算符的结果没有缓存,所以每次在表上使用#时都运行上述算法(没有__len元方法).

关于字符串比较(用于平等):较新的Lua版本在内部有两种类型的字符串:短字符串(通常最多40个字节)和长字符串.使用memcmp比较长字符串(如果长度匹配),则得到O(n).另一方面,短字符串是“interned”,这意味着当您在Lua中创建某个短字符串时,将检查是否已存在具有相同内容的字符串.如果是这样,则重用旧的字符串对象,并且不分配新的字符串.这意味着您可以简单地比较内存地址以检查短字符串的相等性,即O(1).

相关文章

1.进入lua官网http://www.lua.org/ 2.点击download 3.点击get a binary 4.点击[Lua - joedf's ...
    Lua中的函数是一阶类型值(first-class value),定义函数就象创建普通类型值一样(只不过函数类型...
    并发是现实世界的本质特征,而聪明的计算机科学家用来模拟并发的技术手段便是多任务机制。大致上...
    Lua5.0的语法非常简洁,这从参考手册中的语法定义的规模(转换成标准BNF形式大概有100个左右的产...
LUA脚本文档中文翻译(基础)   介绍   Lua读作“鹿啊”,是一种据创作者说的类Pascal脚本语言。巴西...
1. 函数的使用 以下程序演示了如何在Lua中使用函数, 及局部变量 例e02.lua -- functions function pyth...