Chapter 17_2 备忘录函数
一项通用的编程技术:用空间换时间。
例如有一种做法就可以提高一些函数的运行速度,记录下函数计算的结果,当再次调用该函数时,便可以复用之前的结果。
比如,一个普通服务器,在它收到请求中包含Lua代码,会loadstring,编译出新函数。为了避免反复loadstring,用一个辅助table保存编译结果。
local results = {} --辅助的table,记录所有loadstring的结果
function mem_loadstring(s)
local res = results[s]
if res == nil then --是否记录过
res = assert(loadstring(s)) --计算新结果
results[s] = res --存下以备之后复用
end
return res
end
table results会逐渐地积累服务器收到的所有命令及其编译结果。经过一段时间后,这种累积会耗费服务器内存。
弱引用的table可以解决这个问题。如果result table具有弱引用的value,那么每次垃圾收集都会删除所有在执行时未使用的编译结果。
local results = {}
setmetatable(results, {__mode = "v"}) --使value成为弱引用,由于key是字符串,也可以把table变成完全弱引用 __mode = "kv"
function mem_loadstring(s)
<as before>
“备忘录”技术还可以用于确保某类对象的唯一性。
假设一个系统用table来表示颜色,其中3个字段red,green和blue具有相同的取值范围。最简单的颜色生成函数是:
function createRGB(r , g , b)
return {red = r , green = g, blue = b}
end
通过备忘录技术,可以复用具有相同颜色的table,备忘录table的key可以根据颜色分量来生成:
local results = {}
setmetatable(results, {__mode = "v"}
function createRGB(r , g , b )
local key = r .. "-" .. g .. "-" .. b --字符串作为唯一的key,可以通过原始的相等性操作符比较
local color = results[key]
if color == nil then
color = {red = r , green = g, blue = b}
results[key] = color
end
return color
end
若两种颜色相同,那么它们必定是由同一个table表示的。
只要一种颜色正在使用,就不会被清除出results,只要一个颜色未被清除,它就可与颜色进行比较,它的表示也可作为后续调用来复用。
以上内容来自:《Lua程序设计第二版》和《Programming in Lua third edition 》
Chapter 17_2 备忘录函数的更多相关文章
- Chapter 21_2 模式匹配函数
基础函数比较简单,就是几个普通的函数string.byte.string.char.string.rep.string.sub.string.format还有大小写转换函数upper和lower. 接 ...
- Chapter 21_1 字符串函数
接下来开始接触Lua强大的字符串处理能功能——字符串库. 原始的Lua解释器操作字符串的能力很有限,真正强大的能力还是来自字符串库. 它所有的函数都在模块string中.它还为strings设置了一个 ...
- Chapter 15_1 require函数
Lua提供了一个名为require的高层函数来加载模块,但这个函数只假设了关于模块的基本概念. 对于require而言,一个模块就是一段定义了一些值(函数或者包含函数的table)的代码. 为了加载一 ...
- Lua学习笔记一
学习了有一周多了.之前一直不想献丑,但还是记录下这个过程. 第1章 开发软件搭建 1. ubuntu 下lua安装 sudo apt-get install lua5.1 2.win下的环境搭建. ...
- Lua弱引用table
弱引用table 与python等脚本语言类似地,Lua也采用了自动内存管理(Garbage Collection),一个程序只需创建对象,而无需删除对象.通过使用垃圾收集机制,Lua会自动删除过期对 ...
- Unity3D脚本中文系列教程(十)
http://dong2008hong.blog.163.com/blog/static/4696882720140312627682/?suggestedreading&wumii Unit ...
- Cocos2d-x数据持久化-修改数据
修改数据时,涉及的SQL语句有insert.update和delete语句,这3个SQL语句都可以带参数.修改数据的具体步骤如下所示.(1) 使用sqlite3_open函数打开数据库.(2) 使用s ...
- Cocos2d-x数据持久-变更数据
当数据变化,参与SQL报表insert.update和delete声明.这项3个月SQL语句可以带参数. 详细过程的数据,例如,下面的变化看出.(1) 采用sqlite3_open开放式数据库功能.( ...
- C++ one more time
写在前面:我们学习程序设计的方法先是模仿,然后举一反三.在自己的知识面还没有铺开到足够解决本领域的问题时,不要将精力过分集中于对全局无足轻重的地方!!! 以下参考钱能老师的<C++程序设计教程 ...
随机推荐
- django restful webservice返回json数据
做这个demo的前提是你已经配好了python ,django ,djangorestframwork(在我的上一篇博客中有介绍,大家也可以google),mysql-python等. djangor ...
- 该死的类型转换For input string: "[Ljava.lang.String;@1352dda"
今天又遇见了这个该死的问题,还是记下来备忘. 从map里取值的时候,将OBJECT对象 先转换成String 然后转换成integer报错 java.lang.NumberFormatExceptio ...
- spring.net AOP初探
AOP是什么? 面向切面编程,在OO中有一个开放关闭原则,及对修改关闭,对扩展开放.AOP可以说是设计模式的集合加强版,使用代理.工厂.策略等等模式,来实现方法的结合.这样说还比较模糊,我们先往下看. ...
- javascript对象深拷贝,浅拷贝 ,支持数组
javascript对象深拷贝,浅拷贝 ,支持数组 经常看到讨论c#深拷贝,浅拷贝的博客,最近js写的比较多, 所以也来玩玩js的对象拷贝. 下面是维基百科对深浅拷贝的解释: 浅拷贝 One meth ...
- NCache:最新发布的.NET平台分布式缓存系统
NCache:最新发布的.NET平台分布式缓存系统在等待Microsoft完成Velocity这个.NET平台下的分布式内存缓存系统的过程中,现在让我们将目光暂时投向其他已经有所建树的软件开发商.Al ...
- window.setTimeout()函数的使用
<script type="text/javascript"> //此程序主要完成页面定时关闭功能 function closeMyWindow() { window. ...
- 使用Unity创建塔防游戏(Part2)
How to Create a Tower Defense Game in Unity – Part 2 原文地址:https://www.raywenderlich.com/107529/unity ...
- OC之类与对象
1.面向过程与面向对象. 1). 完成需求1 将大象放进冰箱. a. 把冰箱门打开. b. 把大象放进去. c. 把冰箱门关上. 这是面向过程的思路. 找1个冰箱,要求这个冰箱可以自己开门,自己把大象 ...
- python中函数与函数之间的调用,总是晕菜,整理如下,有不对或者补充的请提出来~
1.python函数基础 函数名: fun 函数体:1~3行 返回值:2 调用函数:fun() ,只有见到这个括号(),程序会根据函数名从内存中找到函数体,然后执行它. 2.函数的执行顺序 下面的fu ...
- Vmware Vcenter6.0 全新安装及群集配置介绍
介绍如何安装vsphere ESxi主机及将vmware vsphere5.5升级到vmware vsphere6.0的介绍,而今天呢,主要介绍vsphere vcenter,说到vsphere vc ...