1

自分自身のデータ、別の関数への参照、およびの任意の関数の引数を受け取るポストフック関数があります...。この関数は、参照された関数が戻った後、後処理を行います。簡単にするために、時間をメモしてみましょう。

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

後処理が必要なため、すぐreturn func(...)にはわかりません。また、返品がいくつあるかを事前に知りません。後処理が完了した後、これらの返品をパススルーするにはどうすればよいですか?

これまでのところ、呼び出しをパックしてから、必要なすべてのデータをアップバリューとして後処理クロージャを生成するポストプロセッサフ​​ァクトリlocal results = { func(...) }を使用または作成することしか考えられません。return unpack(results)

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

ただし、これらのアプローチはどちらも、大量の反復とアプリケーションのリアルタイム性を考慮すると、望ましくないオーバーヘッドをもたらします。もっと簡単なものはありますか?

4

1 に答える 1

2

閉鎖は必要ありません。funcとにかくクロージャジェネレータを呼び出す前に呼び出されます。2番目のタグのフックポイントを提供するために、引数を戻り値に直接渡す関数が必要です。

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

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

まだ余分な関数呼び出しのオーバーヘッドが発生していますが、それはクロージャやテーブルを作成するよりも優れており、前処理/後処理のオーバーヘッドよりはるかに少ないです。

于 2012-08-14T22:05:15.700 に答える