3

(選択的に) 無視できるようにしたい lua コードのチャンクがあります。読み込まないという選択肢はなく、処理したい場合もあれば、処理したくない場合もあるため、コメントアウトすることはできません (つまり、大量のコードブロックがあり、どれも読まないか、すべてを読むかを選択できます)。私はこれを実装する 2 つの方法を思いつきました (もっとあるかもしれません - 私は非常に初心者です): コードを関数に囲んでから呼び出すか、関数を呼び出さないか (そして、私が関数を呼び出すポイントを通過した場合はnil、メモリを解放するように設定できます) またはコードをif ... endブロック。前者には、これらのブロックがいくつかあるという点でわずかな利点があり、前者の方法を使用すると、メインプログラムが要求しなくても、あるブロックが別のブロックを簡単にロードできますが、後者の方が効率的です。しかし、あまり詳しくないので、効率の節約に見合う価値があるかどうかはわかりません。

では、どれだけ効率的か:

if false then
    -- a few hundred lines
end

よりも

throwaway = function ()
    -- a few hundred lines
end
throwaway = nil  -- to ensure that both methods leave me in the same state after garbage collection

?

lua の実装に大きく依存している場合、違いを確実に見つけるには「数百行」の大きさが必要であり、最適なテストを行うにはどのようなものを含める必要がありますか (ブロックの主な用途は、おそらく有用な機能の負荷)?

4

4 に答える 4

4

Luaは関数のコードをダンプするほど賢くないので、メモリを節約するつもりはありません。

速度に関しては、プログラムの実行ごとに1回発生するさまざまなナノ秒について話しています。実際のパフォーマンスとは実質的に関係のないこれについて心配することは効率を損なうことになります。賢くしようとせずに、自分の意図を最も明確に表現していると感じるコードを書いてください。パフォーマンスの問題が発生した場合、この決定から100万マイル離れた場所になります。

モバイルプラットフォームで理解できるメモリを節約したい場合は、条件付きコードを独自のモジュールに配置し、不要なものをまったくロードしないでください(フレームワークがサポートしている場合、たとえばMOAIがサポートしている場合、Coronaはサポートしていません)。 。

于 2012-07-30T16:44:16.973 に答える
2

未使用のコードが本当にたくさんある場合は、それを文字列のコレクションとして定義しloadstring()、必要に応じてそれを定義できます。関数を文字列として保存すると、最初のコンパイル時間が短縮されますが、ほとんどの関数の文字列表現は、コンパイルされた形式よりも多くのメモリを消費する可能性があり、コンパイル時に保存するものは、おそらく数千行の前では重要ではありません..

このコードをテーブルに配置すると、繰り返し呼び出しによるパフォーマンスへの影響を最小限に抑えるために、メタテーブルを介して透過的にコンパイルできます。

サンプルコード

local code_uncompiled = {
   f = [=[
      local x, y = ...;
      return x+y;
   ]=]
}
code = setmetatable({}, {
   __index = function(self, k)
      self[k] = assert(loadstring(code_uncompiled[k]));
      return self[k];
   end
});

local ff = code.f; -- code of x gets compiled here
ff = code.f; -- no compilation here
for i=1, 1000 do
   print( ff(2*i, -i) ); -- no compilation here either
   print( code.f(2*i, -i) ); -- no compile either, but table access (slower)
end

その利点は、これが必要に応じてコンパイルされ、実際に別の考えを無駄にする必要がないことです。これは、関数をテーブルに格納するのと同じであり、多くの柔軟性を可能にします。

このソリューションのもう 1 つの利点は、動的にロードされるコードの量が手に負えなくなった場合に、メタテーブルの __index 関数を介してオンデマンドで外部ファイルからコードをロードするように透過的に変更できることです。また、「コード」テーブルに「実際の」関数を入力することにより、コンパイル済みコードとコンパイル済みコードを混在させることができます。

于 2012-08-21T14:36:08.390 に答える
0

最初にコードを読みやすくするものを試してください。ターゲットマシンで十分に高速に実行される場合は、それを使用してください。

十分な速度で実行されない場合は、別の方法を試してください。

于 2012-07-30T16:43:21.887 に答える