Lua Post钩子函数、Post处理和传递所有返回

Lua Post钩子函数、Post处理和传递所有返回,lua,hook,return,post-processing,Lua,Hook,Return,Post Processing,我有一个post-hook函数,它为自己接收一些数据、对另一个函数的引用以及…中该任意函数的参数。在被引用函数返回后,此函数进行一些后处理。为了简单起见,我们只需注意时间: function passthrough(tag, func, ...) metric1[tag] = os.time() func(...) metric2[tag] = os.time() end 因为我需要进行后处理,所以我不能立即返回func(…),而且我也不知道会有多少次返回。完成后处理后

我有一个post-hook函数,它为自己接收一些数据、对另一个函数的引用以及
中该任意函数的参数。在被引用函数返回后,此函数进行一些后处理。为了简单起见,我们只需注意时间:

function passthrough(tag, func, ...)
    metric1[tag] = os.time()
    func(...)
    metric2[tag] = os.time()
end
因为我需要进行后处理,所以我不能立即
返回func(…)
,而且我也不知道会有多少次返回。完成后处理后,我如何传递这些返回

到目前为止,我只能想到在
localresults={func(…)}
中打包调用,然后使用
return unpack(results)
或创建一个后处理器工厂,该工厂将生成后处理闭包,并将所有必要的数据作为upvalue:

local function generate_postprocessor(tag)
    return function(...)
        metric2[tag] = os.time()
        return ...
    end
end

function passthrough2(tag, func, ...)
    metric1[tag] = os.time()
    return generate_postprocessor(tag)(func(...))
end

然而,考虑到大量迭代和应用程序的实时性,这两种方法都会引入一些不需要的开销。还有更简单的吗?

你不需要闭包<在调用闭包生成器之前,将调用code>func。您只需要一个函数,将其参数直接传递到其返回值,为第二个标记提供一个钩子点:

function passthrough_return(tag, ...)
    metric2[tag] = os.time()
    return ...
end

function passthrough(tag, func, ...)
    metric1[tag] = os.time()
    return passthrough_return(tag, func(...))
end

您仍然会得到额外函数调用的开销,但这比创建闭包或表要好,而且远低于预处理/后处理的开销。

打包和解包也可以。你测量过使用它们的影响吗?如果你想避免打包和解包,但可以使用C,那么它很简单。