2016-07-13 6 views
2

パフォーマンスが重要なプロジェクトのテーブルに要素を挿入する必要があるため、どの方法が高速なのかを知る必要がありました。私は以下のコードを実行しました:なぜt [#t + 1] = eはtable.insert(t、e)より速いのですか?

local total = 0 

local mytable = {} 

for i = 1, 1e7 do 
    local clock = os.clock 
    local push = table.insert 
    local t = clock() 

    push(mytable, 0) 

    t = clock() - t 
    total = total + t 
end 

print("table.insert: "..total) 

local total = 0 

local mytable = {} 

for i = 1, 1e7 do 
    local clock = os.clock 
    local t = clock() 

    mytable[#mytable + 1] = 0 

    t = clock() - t 
    total = total + t 
end 

print("Manual approach: "..total) 

をそして、それは、第2の方法は、約2秒速く最初の1よりも走ることが判明します。

最初のものは関数呼び出しですが、2番目のものは#という演算子を呼び出し、追加して、値にインデックスを割り当てます。すべてLua側で行います。それはC側にあります。

なぜ、2番目の方法がより速いのですか?機能は本当に遅いですか?

+3

を挿入します。 t [i] = e'はさらに速くなります –

+5

ループの外で時計のものと 'local push = table.insert'を動かします。それは、おそらくグローバル変数へのアクセスを測定しているからです。すべてが私の約3倍速くなります。そして、私は2つのアプローチの間に7%の違いがあります。 – lhf

+1

@Egor Skriptunoffあなたはテーブルの長さを含む変数を保持する必要がありますか? – user6245072

答えて

0

関数呼び出しのため。 次のコードを表示します。このコードはあなたのコードに基づいています。

function insert(t, v) 
    t[#t + 1] = v 
end 

for i = 1, 1e7 do 
    local clock = os.clock 
    local t = clock() 

    --mytable[#mytable + 1] = 0 
    insert(mytable, 0) 

    t = clock() - t 
    total = total + t 
end 

コードの動作は同じですが、関数呼び出しが1つ増えます。

結果時間が table.insertある:4.705

マニュアルアプローチ:4.752 < - `I = I + 1機能

関連する問題