这些天我正在研究自己的一个小例子/项目。我正在做的是创建n
一组可变长度的随机字符串。这是我想要获得的:
在我的C示例中,我创建了一个struct
并继续作为列表插入到此表中。在我的LUA示例中,我想要一个这样的嵌套表:
tTableName = {
[1] = {
"To" = "Name 1",
"From" = "Name 2",
"Message" = "The first message generated"
}
[2] = {
"To" = "Name 3",
"From" = "Name 4",
"Message" = "The second message generated"
}
}
所以,基本上我的结构是这样的:
struct PM {
char *sTo, *sFrom, *sMessage;
} PMs;
我想在LUA中使用类似的结构/表,以便我可以使用table.insert
方法。我目前正在这样做:
tTempTable = {
"To" = "Name 1",
"From" = "Name 2",
"Message" = "The first message generated"
}
table.insert( tTableName, tTempTable )
但我认为它浪费了大量的处理时间。目前我只生成 30 这类PM的样本;但后来我将生成* 1000 * s。请指教。
答案 0 :(得分:2)
我认为你甚至在知道瓶颈在哪里之前就陷入了预先优化代码的陷阱......但是下面的文档包含了一堆关于lua的优化信息,包括表格。写这篇文章的人是Lua的首席架构师之一。
答案 1 :(得分:1)
首先,这不是一个真正的问题。我猜你会问是否有更有效的方法来做到这一点?一般来说,你想写清楚和don't sweat small performance gains at all unless you run into issues.但是这里有一些关于你的代码的注释,包括一些关于效率的注释:
发布的表构造函数无效。以下任一修复都可以使用:
tTempTable = {
["To"] = "Name 1",
["From"] = "Name 2",
["Message"] = "The first message generated"
}
tTempTable = {
To = "Name 1",
From = "Name 2",
Message = "The first message generated"
}
构造数组时不需要指定数字索引。你可以替换它:
tTableName = {
[1] = { To = "Name 1", From = "Name 2", Message = "The first message generated" },
[2] = { To = "Name 3", From = "Name 4", Message = "The second message generated" },
}
有了这个,这意味着完全相同但更简洁:
tTableName = {
{ To = "Name 1", From = "Name 2", Message = "The first message generated" },
{ To = "Name 3", From = "Name 4", Message = "The second message generated" },
}
这也恰好更有效率; Lua可以预先分配它需要的数组大小,而使用前一个构造函数做它并不够聪明。
至于更好的方式来写这个,很难说不知道更多关于你的应用程序。如果你只是想测试一些PM代码,为什么不在生产时动态生成你需要的字符串呢?为什么要将它们预先分配到表中?
如果必须预先分配,则不必将它们存储为结构化数据。你可以只有三个数组:ToNames,FromNames,Messages,然后在使用点随机选择它们:
local to = ToNames [ math.random(1,#ToNames ) ]
local from = FromNames[ math.random(1,#FromNames) ]
local message = Messages [ math.random(1,#Messages ) ]
TestPM(to, from, message)