5

すべての非ローカルluaオブジェクトは、何らかのテーブルに格納されます。通常、テーブルからオブジェクトを取得するということは、最初にキーのハッシュ計算が行われ、次に対応するオブジェクトが取得されることを意味します。ハッシュ計算の余分なステップを避けたいです。

最も簡単なことは(かつて可能だったように)次のとおりです。

lua_Object o(...some lua call...);
lua_pushobject(o);

しかし、前述のとおり、これはもはや不可能です。luaでは、オブジェクト (具体的には、再作成に時間がかかる大きなテーブル) を格納してからluaスタックにすばやくプッシュするにはどうすればよいでしょうか? レジストリについては知っていますが、それは単なる別のテーブルです。そこから保存/取得すると、ハッシュ計算は回避されません。

編集:

いくつかの詳細:

ラッパー ライブラリのよく知られた問題の 1 つluaは、一時テーブルの問題です。私が電話すると言う:

control:camera():get_something_else()

CFunctionscontrolを含むテーブル (ラップされた C++ オブジェクト) はどこにありますか。このメソッドcameraは、呼び出されるたびにテーブル (別のラップされた C++ オブジェクト) を返します。このテーブルをキャッシュできれば、時間が重要なので毎回再作成する必要がなくなります (パフォーマンス上の理由から C/C++ を使用しています)。また、別のテーブルからテーブルを検索したくありません。これは、いくつかのキー (整数にキャストされたラップされた C++ オブジェクトのインスタンスなど) のハッシュの計算や、その他の検索コストを意味するためです。lua最新のバージョン 5.2を目指しています。

4

2 に答える 2

4

CFunction の結果をキャッシュできる upvalue で問題を解決しました。これにはテーブルが含まれます。CFunction は、nil 以外の値が upvalue に既に存在するかどうかを確認できます。その場合、既存の (上) 値を単に再利用できます。upvalue へのアクセスには、長いルックアップは必要ありません。私は最初に質問をしたので、他の回答を奨励したいので、この回答は受け入れません。

于 2013-11-07T19:29:11.070 に答える
2

実際には、オブジェクトをプッシュしている間はハッシュが計算されていません。要素を追加または削除するときにテーブルが再ハッシュされる

見てくださいlobject.h

#define setobj(L,obj1,obj2) \
 { const TValue *o2=(obj2); TValue *o1=(obj1); \
   o1->value = o2->value; o1->tt=o2->tt; \
     checkliveness(G(L),o1); }

Tableオブジェクト ( ) を入力した場合lobject.h、それらを簡単にコピーして、別の Lua 仮想マシンにそれらを設定できます。マクロ (の値を Yourlobject.hに設定するための同じものから:TValueTable

#define sethvalue(L,obj,x) \
  { TValue *i_o=(obj); \
    i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TTABLE; \
      checkliveness(G(L),i_o); }

唯一のこと...公開Lua C Apiの境界を後にするつもりです... :)

ltable.cともチェックする必要があるかもしれませlstate.hん。後で適切なコード例を作成しようとするかもしれません...

編集:また、再ハッシュ回数を大幅に減らしたい場合は、lua_createtable(lua_State *L, int narr, int nrec);代わりに使用してください... :)

于 2013-11-07T09:22:42.177 に答える