lua 원본 연구 세부 기록

2154 단어 학습 과정
  • LuaJIT버전 64비트 컴파일, 2gb 메모리 한계 돌파
  • # Enable GC64 mode for x64.
    #XCFLAGS+= -DLUAJIT_ENABLE_GC64
    
  • 다중 스레드 중의 루아 동기화 문제
  •       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 충돌로 ljstr_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;
      }
    

    그 다음에 문자열 연결을 줄이고 테이블 연결을 사용합니다.

    좋은 웹페이지 즐겨찾기