3

qsortluajit でコールバックを試す次の例があります。ただし、(実行時に) メモリ リークが発生しますが、luajit: not enough memoryこれは明らかではありません。

適切なコールバックの例を作成する方法について、誰かがヒントを教えてくれますか?

local ffi = require("ffi")

-- ===============================================================================

ffi.cdef[[
    void qsort(void *base, size_t nel, size_t width, int (*compar)(const void *, const void *));
]]


function compare(a, b)
    return a[0] - b[0] 
end

-- ===============================================================================

-- Explicitly convert to a callback via cast
local callback = ffi.cast("int (*)(const char *, const char *)", compare)

local data     = "efghabcd"
local size     = 8 
local loopSize = 1000 * 1000 * 100.

local bytes    = ffi.new("char[15]")

-- ===============================================================================

for i=1,loopSize do 
    ffi.copy(bytes, data, size)
    ffi.C.qsort(bytes, size, 1, callback)
end

プラットフォーム: OSX 10.8 luajit: 2.0.1

4

1 に答える 1

1

問題は、lua がタイト ループ内で完全なガベージ コレクション サイクルを実行する機会を得られないことにあるようです。コメントで示唆されているようcollectgarbage()に、ループ内で自分自身を呼び出すことでこれを修正できます。

すべての反復を呼び出すとcollectgarbage()、ベンチにいるものの実行時間に影響することに注意してください。これを最小限に抑えるには、collectgarbage()呼び出される頻度を制限するしきい値を設定する必要があります。

local memthreshold = 2 ^ 20 / 1024
local start = os.clock()
for i = 1, loopSize do
    ffi.copy(bytes, data, size)
    ffi.C.qsort(bytes, size, 1, callback)
    if collectgarbage'count' > memthreshold then
      collectgarbage()
    end
end
local elapse = os.clock() - start
print("elapsed:", elapse..'s')
于 2013-07-07T21:19:30.633 に答える