我有以下qsort
示例来尝试luajit中的回调。但是它有内存泄漏(执行时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
答案 0 :(得分: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')