2011-09-08 7 views
1

関数名( "エントリポイント"用)と同じ名前のluaスクリプトがたくさんあり、それらを実行したい。しかし私はできるだけ早くそれをしたい。lua関数のコピーのオーバーヘッド

いくつかのブラウジング/グーグル/思考の後、私は2つの解決策を得ました。

1.私には主なlua_Stateがあります。私は必要なものすべてと自分のlibs /関数を "それ"にロードします。次に、現在のluaスクリプトのlua_State関数(lun_State関数)をlua_dump()し、lu_Stateのメイン関数にlua_load()を実行し、lua_State関数を呼び出してlua_State関数を呼び出します。このソリューションでは、すべてのスクリプトのすべてのライブラリをロードする必要はありません。だから、主なlua_Stateは "環境"です。 :)

2.すべてのlua_Stateの読み込みを行うだけです。そしてlua_call()を実行します。

質問は次のようになります。最初の論理も正しいですか?そしてもしそうなら、どちらを使いますか?より良い解決策はありますか?

おかげさまで、私の英語をお詫び申し上げます。

(そして、最初のものは本当に正しいかどうか、いくつか気づかない最適化の可能性があるのですか?)

答えて

2

あなたはそれを置くとして、あなたが以上1つのLuaの状態をしたいと思う理由は、私は表示されません。 Luaの状態が1つだけの場合、すべてのオーバーヘッドはlibsを読み込み(1回)、実行しているスクリプトから関数をロードします(ファイルからそれらをリフレッシュする必要がない限り)。したがって、単純に1つの状態があり、dofileというスクリプトがあります。

あなたが本当にこれらの複数のlua_Statesが必要な場合は in the Lua Reference Manual, in the paragraph just above 5.1

Lua Gems BookでLuaのコードの最適化に素敵な自由に利用できるの章もありますが、説明したように、あなただけの、あなたが必要とするライブラリを読み込むことができます。

0

私は最近似たようなことをして、単一のlua_Stateを使用することに決めました。私は_ENVの値を使用して、すべてのスクリプトファイルを独自の環境にカスタムロードしました(グローバル環境のコピーとしてそれぞれ新しい環境を生成しています)。この方法で名前が矛盾することはなく、何らかの理由で必要に応じて他のスクリプトを並行して実行する可能性があると私は信じています。

ロードされたすべてのスクリプトの関数に基本的に無作為にいつでもアクセスする必要があるので、私の目的のために機能しますが、必要なのは一度だけ実行するだけです。同じlua_State。

編集:私は実際に質問のポイントを逃したことに気づいた。答:標準のライブラリをロードする必要がある場合(オーバーヘッドが目立ちます)、単一のlua_Stateを使用する方が高速になります。 lua_dump/lua_loadを使用しなくても各スクリプトを実行している場合は、luaL_dofileの後に入力機能のlua_pcallを実行してから次のファイルをロードしてください。

関連する問題