Lua 源码学习笔记(4)GC

Lua的GC回收机制 Lua的GC机制GC的原理及其算法设计GC的数据结构Lua垃圾回收详细过程步骤源码详解1.新建对象阶段2.触发条件3.GC函数状态机4.标记阶段5.清除阶段 GC的原理及其算法设计 不同的语言,对GC算法的设计不同,常见的GC算法是引用计数和Mark-Sweep算法, c#采用的是Mark-sweep && compact算法, Lua采用的是Mark-sweep算法,分开说一下: 引用计数算法:在一个对象被引用的情况下,将其引用计数加1,反之则减1,如果计数值为0,则在GC的时候回收,这个 阅读详情

Lua 源码学习笔记(4)GC

参考书籍:《Lua设计与实现》

作者书籍对应Github:https://github.com/lichuang/Lua-Source-Internal

云风的 BLOG,Lua GC 的工作原理:https://blog.codingnow.com/2018/10/lua_gc.html

云风的 BLOG,Lua GC 的源码剖析 (1):https://blog.codingnow.com/2011/03/lua_gc_1.html

探索Lua5.2内部实现:Garbage Collection(1) 原理:https://blog.youkuaiyun.com/yuanlin2008/article/details/8558103

探索Lua5.2内部实现:Garbage Collection(2):https://blog.youkuaiyun.com/yuanlin2008/article/details/8684869

深入探究Lua的GC算法(上)-《Lua设计与实现》:https://www.cnblogs.com/zblade/p/8824376.html

  • Lua版本:5.3.5

概述

  • GC一般原理:遍历系统所有对象,没有引用的对象就认为是可以回收的,可以删除。

  • 引用计数算法:对象被引用的时候加1,反之减1,如果引用数量为0,就是没有引用。这个算法优点是不用遍历所有对象,但是有个缺点是,会有循环引用问题。

  • 标记清除算法:首先扫描标记系统中所有对象,被扫描并且标记到的对象认为是可达的(reachable),这些对象不会不会被回收,反之可以。(Lua使用这种)


Lua5.0版本GC算法:双色标记清除法

在这里插入图片描述

  • 缺点:不能被打断,标记阶段和回收阶段必须一起完成。(即如果中间过程加入新对象,标记为白色就会被回收,标记为黑色就还没有被扫描过。)

Lua5.1版本GC算法:三色标记清除法

  1. 白色:待访问状态。表示对象还没有被垃圾回收的标记过程访问到。
  2. 灰色:待扫描状态。表示对象已经被垃圾回收访问到了,但是对象本身对于其他对象的引用还没有进行遍历访问。
  3. 黑色:已扫描状态。表示对象已经被访问到了,并且也已经遍历了对象本身对其他对象的引用。

在这里插入图片描述

每个新创建的对象颜色设置为白色
//初始化阶段
遍历root节点中引用的对象,从白色置为灰色,并且放入到灰色节点列表中
//标记阶段
while(灰色链表中还有未扫描的元素):
	从中取出一个对象,将其置为黑色
    遍历这个对象关联的其他所有对象:
        if 为白色:
        	标记为灰色,加入到灰色链表中(insert to the head)
 
//回收阶段
遍历所有对象:
    if 为白色,
    	没有被引用的对象,执行回收
    else
    	重新塞入到对象链表中,等待下一轮GC
  • 双白色:简单地说, Lua 中的白色分为“当前白色”( currentwhite )和“非当前白色”( otherwhite ) 。这两种白色的状态交替使用。代码在回收时会做判断,如果某个对象的白色不是此次GC 使用的白色状态,那么将不会认为是没有被引用的对象而回收,这样的白色对象将留在下一次GC 中进行扫描。
// lgc.h

/* Layout for bit use in 'marked' field: */
#define WHITE0BIT	0  /* object is white (type 0) */
#define WHITE1BIT	1  /* object is white (type 1) */
#define BLACKBIT	2  /* object is black */
#define FINALIZEDBIT	3  /* object has been marked for finalization */
/* bit 7 is currently used by tests (luaL_checkmemory) */

具体流程

创建对象luaC_newobj

  1. 创建GCObject
  2. 标记白色
  3. 设置类型
  4. 放到GC列表
// lgc.c

/*
** create a new collectable object (with given type and size) and link
** it to 'allgc' list.
*/
GCObject *luaC_newobj (lua_State *L, int tt, size_t sz) {
  global_State *g = G(L);
  GCObject *o = cast(GCObject *, luaM_newobject(L, novariant(tt), sz));
  o->marked = luaC_white(g);
  o->tt = tt;
  o->next = g->allgc;		// 插在GC列表表头
  g->allgc = o;				/* list of all collectable objects */
  return o;
}

执行单步singlestep

// lgc.h

/*
** Possible states of the Garbage Collector,GC过程中的步骤
*/
#define GCSpropagate	0
#define GCSatomic	1
#define GCSswpallgc	2
#define GCSswpfinobj	3
#define GCSswptobefnz	4
#define GCSswpend	5
#define GCScallfin	6
#define GCSpause	7


static lu_mem singlestep (lua_State *L) {
  global_State *g = G(L);
  switch (g->gcstate) {
    case GCSpause: {			// 一段GC循环的开始
      g->GCmemtrav = g->strt.size * sizeof(GCObject*);
      restartcollection(g);		// 标记为灰色:mark root set and reset all gray lists, to start a new collection
      g->gcstate = GCSpropagate;
      return g->GCmemtrav;
    }
    case GCSpropagate: {		// 传播阶段?
      g->GCmemtrav = 0;
      lua_assert(g->gray);
      propagatemark(g);			// 转换灰成黑(除了线程,一直是灰)
       if (g->gray == NULL)  	// 如果没有灰对象了,就执行下一个阶段
        g->gcstate = GCSatomic;  /* finish propagate phase */
      return g->GCmemtrav;  /* memory traversed in this step */
    }
    case GCSatomic: {
      lu_mem work;
      propagateall(g);  /* make sure gray list is empty */
      work = atomic(L);  /* work is what was traversed by 'atomic' */
      entersweep(L);		// 进入回收阶段
      g->GCestimate = gettotalbytes(g);  /* first estimate */;
      return work;
    }
    case GCSswpallgc: {  /* sweep "regular" objects */
      return sweepstep(L, g, GCSswpfinobj, &g->finobj);
    }
    case GCSswpfinobj: {  /* sweep objects with finalizers */
      return sweepstep(L, g, GCSswptobefnz, &g->tobefnz);
    }
    case GCSswptobefnz: {  /* sweep objects to be finalized */
      return sweepstep(L, g, GCSswpend, NULL);
    }
    case GCSswpend: {  /* finish sweeps */
      makewhite(g, g->mainthread);  /* sweep main thread */
      checkSizes(L, g);				// 有必要时,收缩String表
      g->gcstate = GCScallfin;
      return 0;
    }
    case GCScallfin: {  /* call remaining finalizers */
      if (g->tobefnz && g->gckind != KGC_EMERGENCY) {
        int n = runafewfinalizers(L);		// 针对每个对象调用回收方法
        return (n * GCFINALIZECOST);
      }
      else {  /* emergency mode or no more finalizers */
        g->gcstate = GCSpause;  /* finish collection */
        return 0;
      }
    }
    default: lua_assert(0); return 0;
  }
}



/*
** mark root set and reset all gray lists, to start a new collection
** 标记 mainthread,l_registry,G表 为灰色,最终跑到reallymarkobject
*/
static void restartcollection (global_State *g) {
  g->gray = g->grayagain = NULL;
  g->weak = g->allweak = g->ephemeron = NULL;
  markobject(g, g->mainthread);
  markvalue(g, &g->l_registry);
  markmt(g);
  markbeingfnz(g);  /* mark any finalizing object left from previous cycle */
}

barrier操作

  • 向前走一步:如果一个新创建对象的颜色是白色,而它被一个黑色对象引用了,那么将这个对象的颜色从白色变成灰色。
    • 当前GC没有在扫描阶段标记,就标记这个对象,否则标记白色,等下次扫描。
  • 向后走一步:黑色的对象回退到灰色,也就是这个原先已经被标记为黑色的对象需要重新被扫描。
    • 对于表:只要有对象新增到Table,就回退到灰色重新扫。

/*
** barrier that moves collector forward, that is, mark the white object
** being pointed by a black object. (If in sweep phase, clear the black
** object to white [sweep it] to avoid other barrier calls for this
** same object.)
*/
void luaC_barrier_ (lua_State *L, GCObject *o, GCObject *v) {
  global_State *g = G(L);
  lua_assert(isblack(o) && iswhite(v) && !isdead(g, v) && !isdead(g, o));
  if (keepinvariant(g))  /* must keep invariant? */
    reallymarkobject(g, v);  /* restore invariant */
  else {  /* sweep phase */
    lua_assert(issweepphase(g));
    makewhite(g, o);  /* mark main obj. as white to avoid other barriers */
  }
}


/*
** barrier that moves collector backward, that is, mark the black object
** pointing to a white object as gray again.
*/
void luaC_barrierback_ (lua_State *L, Table *t) {
  global_State *g = G(L);
  lua_assert(isblack(t) && !isdead(g, t));
  black2gray(t);  /* make table gray (again) */
  linkgclist(t, g->grayagain);
}

进度控制

  • 两种方式回收:
    • 自动回收:GCdebt 大于0。
    • 用户调API

/*
** Does one step of collection when debt becomes positive. 'pre'/'pos'
** allows some adjustments to be done only when needed. macro
** 'condchangemem' is used only for heavy tests (forcing a full
** GC cycle on every opportunity)
*/
#define luaC_condGC(L,pre,pos) \
	{ if (G(L)->GCdebt > 0) { pre; luaC_step(L); pos;}; \
	  condchangemem(L,pre,pos); }

/* more often than not, 'pre'/'pos' are empty */
#define luaC_checkGC(L)		luaC_condGC(L,(void)0,(void)0)
lua5.1.3源码分析之GC 一、概述 lua实现了对象间的引用管理,在对象不被其他对象应用时,自动释放对象的内存。 二、lua对象类型和数据结构 1、哪些类型需要GC lua的基本类型包括nil、boolean、number、lightuserdata、string、table、function、userdata、thread九种数据类型,另外还有proto、upvalue两种内部类型。 其中string、table、function、userdata、thread、proto、upvalue是引用类型,可以被其他多个对象同时引用,需 阅读详情

相关推荐

UE4 Unlua源码解析12 - Lua与UE4的混合GC

UE4 Unlua源码解析12 - Lua与UE4的混合GC

TurboQ珞珈 1396

lua_gc 源码学习六

GC 中最繁杂的 mark 部分已经谈完了。剩下的东西很简单。今天一次可以写完。 sweep 分两个步骤,一个是清理字符串,另一个是清理其它对象。看代码,lgc.c 573 行: case GCSsweepstring: { lu_mem old = g->totalbytes; sweepwholelist(L, &g->strt.hash[g->swee

徐中海的专栏[C++] 2676

LUA程序设计一书的源码

《Lua程序设计》(第2版)介绍了Lua语言所具有的功能,并使用大量示例来演示如何将它们运用到实际的任务中。深入地介绍了Lua中唯一的数据结构 table,还讨论了数据结构、持久化、包和面向对象编程。展示了Lua的标准库,对那些想将Lua作为一门独立语言来使用的开发者特别有用,每一章介绍一个库,包括数学库、table库、字符串库、I/O库、操作系统库、调试库介绍Lua与C语言之间的API,这是为那些想用C语言来访问Lua功能的人准备的。

Lua 源码分析之垃圾回收GC

Lua GC算法 1.概览 垃圾回收算法里,有两大类别:一是引用计数法,二是标记清除法(Mark & Sweep)。Lua 采用的是第二种,标记清除法。 在不同的版本中,Lua的GC有不一样的做法。 5.0版本的双色标记算法 在早期的5.0版本使用的是双色标记清除法(Two-Color Mark and Sweep),它的大概原理是:每一个对象的状态非黑即白,要么被引用,要么没有被引用,系...

kelvin_feng的专栏 1444

Lua经典编程书籍三本

Lua经典编程书籍三本 gisit2012-05-11上传 三本书:1、Lua编程指南; 2、Lua程序设计_第二版_中文; 3、Programming in Lua, 2Nd Edition

步科触摸屏编程

1.首先官网上下载kinco软件,然后再安装驱动,安装的方式是需要两个文件。把两个文件放到driver文件夹下面,然后设备管理器右键更新,手选driver文件夹,自动安装即可。 步科触摸屏驱动文件下载地址 2.按照步科触摸屏使用手册一步一步来建立工程 Kinco HMIware使用手册下载地址 登录界面 涉及到的是页面切换,用的是login window,然后只留下等级输入那个

MAYBE的博客 2万+

lua的gc原理

原因:在GC标记阶段结束而清除阶段尚未开始时,如果新建一个对象,由于其未被发现引用关系,原则上应该被标记为白色,于是之后的清除阶段就会按照白色被清除的规则将新建的对象清除。:在初始标记后,垃圾回收器继续遍历灰色对象,将它们标记为黑色,同时将它们引用的白色对象变为灰色。:从根集合(如全局变量、栈、寄存器等)开始,将根集合中的对象标记为黑色,并将其引用的对象标记为灰色。黑色对象及其引用的所有对象都是被标记为活跃对象,不会被垃圾回收。:初始状态下,所有的对象都被假设为白色,表示这些对象是未访问的、未标记的。

⎝⏠⏝⏠⎠ 1923

手把手教 - VSCode 开发 GD32F450 单片机

系统版本:rt-thread v5.2.2单片机型号:GD32F450ZK基于文章进行开发。

weixin_46158019的博客 841

Lua GC机制原理、过程、源码详解

lua垃圾回收(Garbage Collect)是lua中一个比较重要的部分。由于lua源码版本变迁,目前大多数有关这个方面的文章都还是基于lua5.1版本,有一定的滞后性。因此本文通过参考当前的5.3.4版本的Lua源码,希望对Lua的GC算法有一个较为详尽的探讨。 1.Lua垃圾回收算法原理简述 lua采用了标记清除式(Mark and Sweep)GC算法,算法简述: 标记:每次执行GC时,先以若干根节点开始,逐个把直接或间接和它们相关的节点都做上标记; 清除:当标记完成后,遍历整个对象链表,把被标记

qq_1628941121的博客 9968

WIFI中CSI的读取

学习目标: 目前正在做基于WIFI的无设备定位,准备使用信道状态信息(CSI),学习一下。 目前采集数据环境已经搭建好,准备研究信号的预处理。 学习内容: 1、 信号的读取——read_bf_file函数的研究 2、 3、 4、 1. read_bf_file详解: %READ_BF_FILE Reads in a file of beamforming feedback logs. % This version uses the *C* version of read_bfee, ...

sz3076799的博客 8892

解放双手:用KUKA示教器白键一键触发复杂工艺,自定义你的快捷指令

本文详细介绍了如何利用KUKA示教器的工艺白键功能,通过自定义快捷指令一键触发复杂工艺,显著提升自动化产线效率。文章涵盖UserTech技术栈解析、KRL脚本封装、人机交互视觉工程及工业实战策略,帮助工程师实现机械臂操作的高阶优化。

weixin_30379531的博客 432

对Lua中Userdata的理解

目录 一、概述 二、源码实现 相关函数实现 1,lua_pushlightuserdata 2,lua_newuserdata 3,luaC_newobj(lgc.c) 4,createstrobj(lstring.c) 三、总结 一、概述 Lua中userdata分两类: 1,是轻量级userdata(light userdata),轻量级userdata是一种表示C指针的值,对Lua虚拟机来说,这种数据类型不需要GC(垃圾回收),其指向的内存由用...

m1234567q的专栏 1万+

分享一些基于微信小程序开发的小游戏源码

小游戏小程序是运行在微信生态系统(或其他支持小程序的平台)中的轻量级应用程序,专为休闲游戏体验而设计的小程序子类别,小游戏小程序通常体积较小,加载速度快,用户无需等待长时间即可开始游戏。用户无需下载或安装单独的游戏应用程序,即可通过小程序入口直接进入游戏,同时小游戏小程序通常包含排行榜、分享功能等社交元素,可以增强游戏体验并促进用户参与。game.js:游戏页面的逻辑文件,包含页面数据、生命周期函数、事件处理函数等。game.wxml:游戏页面的结构文件,定义了页面的布局和组件。

xinshangdian的博客 6226

Lua GC原理分析

lua gc原理

qq_25978293的博客 1602

Raid5损坏两块盘

  以下为浪潮Inspur NF5460M4型号服务器故障处理过程: 设备raid5组损坏两块硬,并raid组处理离线状态,情况如图:     由于硬盘数据比较重要,面对此情况不要慌我们尽量做到安全保守的保证数据尽可能完整,以下为处理方法,(遇raid5两块盘出现问题处理方法)   以下截图均为遇相同问题的解决图案,并非现场截图。 Ctrl+H 进WebBios界面,发现两...

chen_lipeng的博客 2万+

uniapp [安卓苹果App端] - 解决支付宝支付报错requestPayment:fail [payment支付宝:62009]未知错误,使用uni.requestPayment支付报错排查方案

uni-app支付宝,uniapp支付宝沙箱支付报错,uni.requestPayment,uniAPP App支付宝支付提示错误requestPayment:fail [payment支付宝:62009]未知错误,UNI-APP支付宝报错"code": -100,uniapp 解决安卓App使用uni.requestPayment实现沙箱环境支付宝支付报错,uniapp安卓app使用支付宝的沙箱环境支付时报了这个错,安卓端app支付宝支付,在沙箱测试环境测支付,提示“商家订单参数异常,请重新发起付款,选择

🏆 前端领域优质创作者 9609

lua的GC

关于lua的gc云风大佬在系列文章中讲得很清楚,这里做一下简单的记录。

https://gitee.com/liuyuan185442111/chest-view 1785

携程滑块、点选验证码登录识别逆向

本文分析了携程登录系统的风控机制,主要包含三种验证场景:无验证码、滑块验证码和二次图标点选验证码。通过跟踪risk_inspect风控接口,发现验证流程采用标准AES加密,需提交设备指纹等加密信息。当触发验证码时,需额外提交包含轨迹坐标的verify_msg参数及token/rid参数。最终通过风控检测后,需使用一致的指纹参数和验证token完成加密登录。文章强调所有分析仅用于学习,代码实现需确保符合法律规范。

码王吴彦祖的博客 1100

lua源码解析——gc实现机制[详细版](一)

前言 gc几乎是在所有计算机的高级语言中都会遇到的问题,语言本身的gc机制可以让程序员在开发的过程中用更多的精力去关心工程的逻辑实现,少花时间去关注逻辑底层的内存模型。但是有些时候我们也会遇到一些内存瓶颈的问题,这样就有必要去了解语言本身的内存模型和gc机制了。因此本文会详细介绍lua的gc实现机制以及背后的内存管理机制,并从代码层面逐段逐行去解析这些秘密。 一、lua使用的GC原理 二、lua底层数据的内存模型 三、lua的GC过程 ...

hbhgyt的博客 4726

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

lua_gc 源码学习二

普及下常识:GC 是 garbage collector 资源回收器; 初期的 Lua GC 采取的是 stop the world 的实现。一旦产生 gc 就需要期待全部 gc 流程走完。lua 自己是个很精简的体系,但不代表处理的数据量也必然很小。 从 Lua 5.1 入手下手,GC 的实现改成分步的。固然照旧是 stop the world ,可是,每个步骤均可以分阶段执行。这样,屡次搁

徐中海的专栏[C++] 4142

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

lua_gc 源码学习三

我们晓得,lua 对外的 API 中,统统个 gc 打交道的都经过lua_gc。C 说话构建体系时,普通不讲计划模式。但模式仍是存在的。若要按《计划模式》中的分类,这应当归于 Facade 形式。代码在 lapi.c 的 895 行: LUA_API int lua_gc (lua_State *L, int what, int data) { int res = 0; global_Stat

徐中海的专栏[C++] 3797

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

图解Lua分代GC

图解Lua分代GC

云飞扬的博客 333

风云lua分析-Lua GC 的源码剖析 (1)

以下内容转载自 https://blog.codingnow.com/2011/03/lua_gc_1.html 最近发现在大数据量的 lua 环境中,GC 占据了很多的 CPU 。差不多是整个 CPU 时间的 20% 左右。希望着手改进。这样,必须先对 lua 的 gc 算法极其实现有一个详尽的理解。我之前读过 lua 的源代码,由于 lua 源码版本变迁,这个工作还需要再做一次。这次我重新阅读了 lua 5.1.4 的源代码。从今天起,做一个笔记,详细分析一下 lua 的 gc 是如何实现的。阅读代

Shanks 722

Lua 5.3 GC 垃圾回收的实现

虽然本系列主要讲的是 Lua 5.3 中的实现,不过在本篇中,想先聊聊 Lua 垃圾回收的历史。只有了解其历史,才知道为什么这么设计。

m0_73915763的博客 473

风云lua分析-Lua GC 的源码剖析 (4)

以下内容转载自 https://blog.codingnow.com/2011/03/lua_gc_4.html 今天来看一下 mark 过程是怎样实现的。 所有的 GC 流程,都从 singlestep 函数开始。singlestep 就是一个最简单的状态机。GC 状态简单的从一个状态切换到下一个状态,循环不止。状态标识放在 global state 的 gcstate 域中。这一点前面谈过。 开始的两个状态和 mark 过程有关。 初始的 GCSpause 状态下,执行 markroot 函数

Shanks 548

风云lua分析-Lua GC 的源码剖析 (3)

以下内容转载自 https://blog.codingnow.com/2011/03/lua_gc_3.html 有了前几天的基础,我们可以从顶向下来读 lua gc 部分的代码了。 我们知道,lua 对外的 API 中,一切个 gc 打交道的都通过lua_gc。C 语言构建系统时,一般不讲设计模式。但模式还是存在的。若要按《设计模式》中的分类,这应该归于 Facade 模式。代码在 lapi.c 的 895 行: /* ** Garbage-collection function */ LUA..

Shanks 741
上一篇: Lua 源码学习笔记(3)表
下一篇: 游戏设计模式学习笔记(1)设计原则、看懂类图
ChiLi_Lin
博客等级 码龄12年 760粉丝 184原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值