gpt4 book ai didi

callback - luajit qsort回调示例内存泄漏

转载 作者:行者123 更新时间:2023-12-02 03:45:54 26 4
gpt4 key购买 nike

我有以下 qsort 示例来尝试 luajit 中的回调。但是它有内存泄漏(luajit:执行时内存不足),这对我来说并不明显。

有人可以给我一些关于如何创建正确的回调示例的提示吗?

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.8luajit: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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com