lua源码研究一些细节记录

Posted 帝王铠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lua源码研究一些细节记录相关的知识,希望对你有一定的参考价值。

  • LuaJIT版本编译64位,突破2gb内存限制
# Enable GC64 mode for x64.
#XCFLAGS+= -DLUAJIT_ENABLE_GC64
  • 多线程中的lua同步问题
修改 源码中llimits.h的
#define lua_lock(L) ((void)0)
#define lua_unlock(L)	((void) 0)
重写这两个宏。以添加pthread提供锁功能为例:
在lstate.h中,对GlobalState结构新加一个成员:
pthread_mutex_t lock;
然后在lua_newstate中添加初始化代码:
pthread_mutex_init(&g->lock, NULL);
接着重定义lock/unlock宏(写在原定义前面即可):
#define lua_lock(L) pthread_mutex_lock(&(G(L)->lock));
#define lua_unlock(L) pthread_mutex_unlock(&(G(L)->lock));
最后在close_state函数的末尾添加两行:

static void close_state (lua_State *L) 
  global_State *g = G(L);
  luaF_close(L, L->stack);  /* close all upvalues for this thread */
  luaC_freeallobjects(L);  /* collect all objects */
  luaM_freearray(L, G(L)->strt.hash, G(L)->strt.size);
  luaZ_freebuffer(L, &g->buff);
  freestack(L);
  lua_assert(gettotalbytes(g) == sizeof(LG));
 pthread_mutex_unlock(&g->lock);
 pthread_mutex_destroy(&g->lock);
  (*g->frealloc)(g->ud, fromstate(L), sizeof(LG), 0);  /* free main block */

  • 字符串太多hash冲突导致lj_str_new调用过多效率问题
    可以参考openresty源码处理如下,改hash策略
static LJ_AINLINE uint32_t lj_str_hash(const char* str, size_t len)

  if (len < 128) 
    if (len >= 16)  /* [16, 128) */
      return lj_str_hash_16_128(str, len);
    

    if (len >= 4)  /* [4, 16) */
      return lj_str_hash_4_16(str, len);
    

    /* [0, 4) */
    return lj_str_hash_1_4(str, len);
  
  /* [128, inf) */
  return lj_str_hash_128_above(str, len);

luajit原始版本

if (len >= 4)   /* Caveat: unaligned access! */
    a = lj_getu32(str);
    h ^= lj_getu32(str+len-4);
    b = lj_getu32(str+(len>>1)-2);
    h ^= b; h -= lj_rol(b, 14);
    b += lj_getu32(str+(len>>2)-1);
   else if (len > 0) 
    a = *(const uint8_t *)str;
    h ^= *(const uint8_t *)(str+len-1);
    b = *(const uint8_t *)(str+(len>>1));
    h ^= b; h -= lj_rol(b, 14);
   else 
    return &g->strempty;
  

其次减少字符串拼接,用table拼接。

以上是关于lua源码研究一些细节记录的主要内容,如果未能解决你的问题,请参考以下文章

源码赏析带你零基础掌握Lua!

lua源码笔记-基本数据结构

centos7源码编译安装lua:lua5.1升级lua5.3

奇舞周刊第 266 期: 巧用 Typescript

如何消除Go的编译特征.md

Lua性能优化之table