5

コードを最適化する方法。Luaのメモリにどちらが適しているかわからない3つのオプションがあります。

1)

local Test = {}
    Test.var1 = function ()
        -- Code
    end

    Test.var2 = function ()
        -- Code
    end

2) または

function var1()
    -- Code
end

function var2()
    -- Code
end

3) または多分

local var1 = function ()
    -- Code
end

local var2 = function ()
    -- Code
end
4

3 に答える 3

7

Lua Programming Gemからの引用、プログラム最適化の 2 つの原則:

  • ルール 1: やらない。
  • ルール 2: まだ実行しないでください。(専門家のみ)

例に戻ると、グローバル コードへのアクセスが遅いため、コードの 2 番目の部分は少し悪いです。しかし、パフォーマンスの違いはほとんど目立ちません。

必要に応じて、最初のものは 3 番目のものよりも余分なテーブルを使用しますが、名前空間はよりクリーンです。

于 2013-10-04T12:27:45.507 に答える
2

#1でテーブルを使用しない限り、実際にメモリに影響を与えるものはありません(したがって、約40バイト+エントリごとにいくらか)。

パフォーマンスが必要な場合は、ローカルスコープで上記の関数にアクセスできると仮定して、オプション #3 の方がはるかに優れています。

于 2013-10-04T12:49:53.207 に答える
0

処理よりもメモリ使用量が重要で、上記のように の複数のインスタンスをインスタンス化するオブジェクト指向プログラミングを使用している場合Testは、メタテーブルを使用する 4 番目のオプションがあります。

TestMt = {}
TestMt.func1 = function(self, ...)
    ...
end
TestMt.func2 = function(self, ...)
    ...
end
TestMt.func3 = function(self, ...)
    ...
end

function new_test()
    local t = {}
    t.data = ...
    setmetatable(t, {__index = TestMt})
    return t
end

foo = new_test()
foo:func1()
foo:func2()
foo:func3()

オブジェクト指向の種類のプログラミングを行っている場合、メタテーブルはメモリの大幅な節約につながる可能性があります (この方法で多数の数学的ベクトルに 1 ギガバイト以上を誤って使用したことがありましたが、メタテーブルを使用して 40 メガバイトまで削減しました)。

何度もインスタンス化されるオブジェクトやテーブルではなく、グローバルにアクセス可能な関数を整理するだけなら、ここでメモリを心配するのはばかげています。これは、ファイル システムのオーバーヘッドを削減するために、lua コード全体を 1 つのファイルに入れるようなものです。ごくわずかな節約について話しているので、それを気にするためにも、細心の注意を払った測定に裏打ちされた並外れたユースケースが本当に必要なはずです。

処理に関するものであれば、グローバル関数をネストされたテーブルから除外し、可能な場合はローカル関数を優先することで、いくつかの小さな改善を得ることができます。

于 2015-05-05T18:41:51.980 に答える