我有以下函数只返回其字符串参数:
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代码调用。)
答案 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,它返回使用的密钥。