"no op"函数应该在Lua还是C中实现?



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

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元方法,如果该表没有这样的条目,则返回所使用的键。

相关内容

  • 没有找到相关文章

最新更新