3

このマシンでは、dofileを使用してluaでほぼ些細なスクリプトを10000回実行すると、約52秒かかりますが、「lua52script.lua」を10000回実行すると、3〜4倍の時間がかかります。より多くのシステムコールやその他のオーバーヘッドがあることは承知していますが、私が達成しようとしているのは、たとえば3秒のタイムアウトでスクリプトを実行し、出力を出力することです。私の問題は、意図的かどうかに関係なく、無限ループのスクリプトです。たとえば、次のようになります。

while(true) do
end

Lua内からdofileのタイムアウトを作成できますか?毎回timeout(3)でインタープリターを呼び出す唯一のオプションはありますか?

4

3 に答える 3

4

私のような初心者が Lua の問題で lhf を修正するのは少し間違っているように感じますが、ここに行きます。"count" を debug.sethook に渡すことは、"c" または "call" を渡すことと同じです。n VM 命令の後に関連する関数を起動するために渡す正しいマスクは "" です。

そのため、dofile() からロードされたコードの実行時間を制限するには、次のようなものを使用します。

local f = function() error("timeout") end
local x,y = xpcall(function()
  debug.sethook(f, "", 1e8)
  local ret = dofile("script.lua")
  debug.sethook()
  return ret
end, debug.traceback)
于 2012-07-11T03:14:02.220 に答える
1

スクリプトで C 関数を呼び出さない場合は、countフックを大きなカウント値で使用して、フック内でエラーを発生させることができます。

local function f() error"timeout!" end
debug.sethook(f,"count",1e6)
while true do end

アプリケーションで、dofileを呼び出す前にcountフックを設定します。

countフックは、n 個のLua VM 命令ごとに呼び出されます。ただし、C 関数でかかる時間を考慮する方法がないため、上記の注意点があります。

于 2012-06-30T00:39:27.447 に答える
0

組み込みの機能はありません。lalarmライブラリを使用してみてください。

于 2012-06-29T21:07:12.950 に答える