3

我有以下函数,它只返回其字符串参数:

function N_(s)
  return s
end

您可以从gettext中识别此函数名称。它是仅用于 .pot 提取器的标记。

在 C 或 Lua 中实现 N_() 会更有效吗?

你能给我一个经验法则吗?

另一个问题:

假设我有一个更复杂的函数:

function Z_(s)
  return dict[s] or s
end

在 C 或 Lua 中实现 Z_() 会更有效吗?

(我将从 Lua 代码而不是 C 代码调用 N_() 和 Z_()。)

4

2 回答 2

5

我没有测量这种情况下的差异,但我希望用 Lua 编写它会更快。调用 C 函数的成本要高一些。

根据经验,一切都用 Lua 编写,除非它是一个存在库 C 函数的长期任务。

请记住,编写 Lua 代码可能比 C 代码更有效率。因此,您可能会在 Lua 中更快地做到这一点。性能可能会足够好。

在所有情况下,YMMV 等都要自己测量。

于 2013-12-25T13:00:39.673 回答
2

如果您将大部分时间花在 Lua 上,那么在 Lua 中实现的处理器密集度不是很高的函数很可能比 C 中的函数更有效。如果您在未来某个时间最终使用LuaJIT ,则尤其如此。如果它是语言中的函数,编译器总是能够从你的函数中推断出更多的信息,而不是它是一些它不知道的晦涩的 C 函数,并且它不必在不同的上下文中做太多的跳跃。

在 C 中实现的问题Z_是您还必须dict在 C 中实现,而 Lua 已经具备这样的功能。所以,这取决于你是否需要一些特别优化的哈希图,也许 C 会更好。


如果您关心函数调用效率,为什么不缓存结果呢?

-- instead of doing:
print(Z_('Hello world! My name is %1!', 'Lua'))
-- perhaps do this:
local greeting = Z_('Hello world! My name is %1!', 'Lua')
print(greeting)
-- reuse greeting at some later time.

当然,您的Z_函数看起来还不需要替换但我认为以后可能会。但是,如果您从不需要替换,也可以将其设为这样的表格:

local Z = setmetatable({}, {__index = function(t,k) return k end})
Z['greetings'] = 'Hello world!'
print(Z['greetings']) -- Hello world!
print(Z['goodbye']) -- goodbye

__index如果该表没有这样的条目,则该表有一个返回使用的键的元方法。

于 2013-12-25T13:18:35.527 回答