【问题标题】:Should a "no op" function be implemented in Lua or in C?是否应该在 Lua 或 C 中实现“无操作”功能?
【发布时间】:2014-01-13 09:46:32
【问题描述】:

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

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_()。)

【问题讨论】:

    标签: lua gettext noop


    【解决方案1】:

    我没有测量这种情况下的差异,但我希望用 Lua 编写它会更快。调用 C 函数有点贵。

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

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

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

    【讨论】:

    • 编写 Lua 代码比编​​写 C 代码更有效率这一点非常好。效率不仅是计算机效率,也是人的效率。
    【解决方案2】:

    如果您将大部分时间花在 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 元方法,如果表没有这样的条目,它会返回使用的键。

    【讨论】:

    • 上个例子使用弱表怎么样?
    猜你喜欢
    • 2010-10-20
    • 1970-01-01
    • 2010-11-21
    • 2013-07-28
    • 1970-01-01
    • 2020-06-19
    • 2011-10-10
    • 2016-01-25
    • 2015-08-04
    相关资源
    最近更新 更多