应该在Lua或C中实现“无操作”功能吗?

时间:2013-12-25 12:46:27

标签: lua gettext noop

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

function N_(s)
  return s
end

您可以从gettext识别此功能名称。它只是.pot提取器的好处标记。

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

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

另一个问题:

假设我的功能有点复杂:

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

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

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

2 个答案:

答案 0 :(得分:5)

我没有测量过这种情况的区别,但我希望用Lua写它会更快。调用C函数要贵一些。

根据经验,将它全部写在Lua中,除非它是一个存在库C函数的长任务。

请记住,编写Lua代码可能比使用C代码更有效率。因此,你很可能在Lua中早日做好准备。表现可能会足够好。

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

答案 1 :(得分:2)

如果你把大部分时间花在Lua上,那么在Lua中实现的处理器密集程度很高的函数很可能比C语言中的函数效率更高。如果您将来某个时间最终使用LuaJIT,则尤其如此。编译器总是能够从函数中推断出更多信息(如果它是语言中的信息),而不是它不知道任何关于它的一些模糊的C函数,并且它不必在不同的上下文中进行那么多的跳转。 / p>

在C中实现Z_的问题是你还必须在C中实现dict,其中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 metamethod,它返回使用的密钥。