我有以下函数,它只返回字符串参数:
function N_(s)
return s
end
您可以从gettext中识别出这个函数名。这是一个标记,仅用于提取器。
用C语言还是用Lua语言实现N_()更有效?
你能给我一个经验法则吗?
另一个问题:
假设我有一个更复杂的函数:
function Z_(s)
return dict[s] or s
end
在C中实现Z_()会更高效吗?还是在Lua中实现?
(我将从Lua代码调用N_()和Z_(),而不是从C代码调用。)
我还没有测量出这种情况下的差异,但我希望用Lua编写它会更快。调用C函数的成本要高一些。
根据经验,除非这是一个存在库C函数的长任务,否则请使用Lua编写所有内容。
请记住,编写Lua代码可能会比编写C代码更有效率。因此,在卢阿,你很可能会更快地把事情做好。表演可能足够好了。
在所有情况下,YMMV和因此测量它自己。
如果您将大部分时间花在Lua中,那么在Lua实现的不太占用处理器的函数很可能比在C中实现的函数更高效。如果您在将来某个时候使用LuaJIT,这一点尤其正确。如果函数在语言中,编译器将始终能够从函数中推断出更多的信息,而不是它一无所知的某个晦涩的C函数,而且它不必在不同的上下文中跳来跳去。
在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
元方法,如果该表没有这样的条目,则返回所使用的键。