1

这些天,我正在研究自己的一个小例子/项目。我正在做的是创建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 * 个它们。请指教。

4

2 回答 2

2

我认为您甚至在知道瓶颈在哪里之前就陷入了过早优化代码的陷阱……但是以下文档通常包含一堆有关 lua 的优化信息,包括表格。编写它的人是 Lua 的首席架构师之一。

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

于 2012-05-12T13:38:40.887 回答
1

首先,这不是一个真正的问题。我猜你会问是否有更有效的方法来做到这一点?一般来说,你想写的清晰,除非你遇到问题,否则根本不要为了小的性能提升而汗流浃背。但是这里有一些关于你的代码的注释,包括一些关于效率的注释:

发布的表构造函数无效。以下任一修复程序都可以工作:

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)
于 2012-05-12T20:40:28.287 回答