本文主要是介绍Lua程序设计(五十七),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
记忆函数
一种常见的编程技巧是用空间换时间。我们可以通过一种叫做记忆函数的函数来执行结果,在后续使用相同参数再次调用该函数时直接返回之前记忆的结果,来加快函数的执行速度。
假设我们有一个通用的服务器,该服务器接受的请求是以字符串形式表示的Lua语言代码。每当服务器接收到一个请求时,它就对字符串运用load函数,然后再调用编译后的函数。不过,我们知道,函数load的开销很昂贵,而且发送给服务器的某些命令的出现频率可能很高。这样,与其每次收到一条诸如"closeconnection()“”这样的常见命令就重复地调用函数load,还不如让服务器用一个辅助表记忆所有函数load的执行结果。在调用函数load前,服务器先在表中查找指定的字符串是否已经被处理过,如果没有,就(且只在这种情况下)调用函数load并将返回值保存到表中。
local result = {}
function mem_loadstring (s)local res = results[s]if res == nil thenres = assert(load(s))results[s] = resendreturn res
end
这种模式节省的开销非常可观,但是,它亦可能导致不易察觉的资源浪费。 虽然有些命令会重复出现,但也有很多命令可能就出现一次。results表会堆积上服务器收到的所有命令的编译结果;这种行为将很有可能耗尽服务器的内存。
弱引用表为解决这个问题提供了一种简单的方案,如果表results具有弱引用的值,那么每个垃圾收集周期都会删除在调用时刻时未使用的编译结果。
local results = {}
setmetatable(results, {__mode = "kv"})
function mem_loading(s)local res = results[s]if res == nil thenres = asset(load(s))results[s] = resendreturn res
end
这篇关于Lua程序设计(五十七)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!