我有以下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
最佳答案
问题似乎是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')
关于callback - luajit qsort回调示例内存泄漏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17191292/