将随机生成的字符串作为嵌套表插入

时间:2012-05-12 11:53:38

标签: string random lua lua-table

这些天我正在研究自己的一个小例子/项目。我正在做的是创建n一组可变长度的随机字符串。这是我想要获得的:

  • 两个长度为3到25个字符的名称。
  • 消息范围为40到300个字符。

在我的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。请指教。

2 个答案:

答案 0 :(得分:2)

我认为你甚至在知道瓶颈在哪里之前就陷入了预先优化代码的陷阱......但是下面的文档包含了一堆关于lua的优化信息,包括表格。写这篇文章的人是Lua的首席架构师之一。

http://www.lua.org/gems/sample.pdf

答案 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)