Lua 성능 최적화 Tips

3085 단어
머리말
Lua 공식 문서 요약 (fan yi) 을 바탕 으로 한 글 입 니 다 -)
Lua 의 속성 에 대하 여
  • Lua 의 모든 active 함수 에는 activation record 가 있 습 니 다. 데이터 구 조 는 stack (물론 이 루어 진 데이터 구 조 는 배열 입 니 다) 입 니 다. activation record 는 이 함 수 를 저장 하 는 Registers 레지스터 입 니 다. 한 함수 에 최대 250 여 개의 레지스터 를 가 질 수 있 습 니 다. 레지스터 를 가리 키 는 지침 은 8 비트 (bit) 밖 에 없 기 때 문 입 니 다.
  • Lua 의 Table 에는 2 부분 이 포함 되 어 있 으 며, 일 부 는 array 이 고, 일 부 는 hash 이 며, 1 - n 범위 내 데 이 터 는 array 에 저장 되 어 있 으 며, n 이외 의 다른 데 이 터 는 hash 에 저장 되 어 있 으 며, 그 중에서 hash 부분 은 open address 개방 주소 지정 법 을 사용 하 였 다.기본 table 의 크기 는 0 입 니 다. 새 key 가 가입 하려 면 table 크기 는 0 - > 1, 1 - > 2, 2 - > 4...Table 은 rehash 의 경우, 즉 insert 의 경우 에 만 shrink Table 을 축소 할 수 있 습 니 다. 이 는 두 가지 이유 로 이 루어 집 니 다. 하 나 는 nil 검 사 를 피 하 는 것 이 고, 다른 하 나 는 순환 에서 값 을 부여 하 는 것 입 니 다.

  • So, Lua traverses all entries, counting and classifying them, and then chooses as the size of the array part the largest power of 2 such that more than half the elements of the array part are filled. The hash size is then the smallest power of 2 that can accommodate all the remaining entries (that is, those that did not fit into the array part).
  • Lua 의 문자열 은 내부 연결 (internalized) 입 니 다. 즉, 문자열 의 복사 만 저장 하고 새 string 이 나타 나 면 lua 는 이 문자열 이 존재 하 는 지 확인 하고 재 활용 합 니 다.이러한 방법 은 장점 도 있 고 단점 도 있다. 장점 은 문자열 비교 (포인터 가 같은 지 비교 하면 된다) 이다. 단점 은 새 문자열 의 속 도 를 낮 추 는 것 이다 (문자열 이 이미 존재 하 는 지 먼저 찾 아야 한다).위 에서 말 한 바 와 같이 변 수 는 문자열 만 가리 키 고 있 습 니 다.

  • 기교.
    기술 1 local 변 수 를 사용 합 니 다.
    local 변 수 를 사용 합 니 다. a = a + b 를 예 로 들 면 a, b 가 전역 변수 일 때 a, b 가 국부 변수 일 때의 비 교 는 다음 과 같 습 니 다.
    a = a + b;
    
    GETGLOBAL 0 0 ; a
    GETGLOBAL 1 1 ; b
    ADD 0 0 1
    SETGLOBAL 0 0 ; a
    
    local a;
    local b;
    a = a +b;
    
    ADD 0 0 1
    

    로 컬 을 사용 하 는 것 이 세 번 부족 한 것 이 분명 합 니 다.
    For instance, the code
    for i = 1, 1000000 do
    local x = math.sin(i)
    end
    

    아래 의 서법 보다 30% 느리다
    local sin = math.sin
    for i = 1, 1000000 do
    local x = sin(i)
    end
    

    테크닉 2 테이블
    Table rehash 의 횟수 를 줄 이기 위해 서 는 여러 번 의 할당 과 같은 구조 방법 을 직접 사용 할 수 있 습 니 다.
     local param = {};
    param.type = 1;
    param.id = 1;
    

    직접 값 을 부여 합 니 다. Lua 는 table 이 2 개의 요 소 를 수용 하고 해당 크기 의 table 을 새로 만들어 야 한 다 는 것 을 알 수 있 습 니 다.
     local param = {type= 1, id = 1};
    

    기술 3 문자열
    table. concat 연결 문자열 사용 하기
    테크닉 4 재 활용
    이것 은 매개 변수 에 적용 되 는 방법 으로 호출 되 고 방법의 계산 결 과 를 저장 하여 중복 계산 을 방지 합 니 다.
    function memoize (f)
      local mem = {} -- memoizing table
      setmetatable(mem, {__mode = "kv"}) -- make it weak
      return function (x) -- new version of ’f’, with memoizing
          local r = mem[x]
          if r == nil then -- no previous result?
            r = f(x) -- calls original function
            mem[x] = r -- store result for reuse
          end
        return r
      end
     end
    

    기술 5 쓰레기 회수
    Lua 쓰레기 회수 속 도 는 메모리 소모 속도 와 정비례 한다.쓰레기 수 거 에 대해 서 는 두 개의 인터페이스 Lua collectgarbage 와 C lua_gc 가 있 으 며, 쓰레기 수 거 를 일괄 처리 하거나 시간 에 민감 한 프로그램 에 사용 하지 않 는 다.
    참조 링크
    Lua 공식 문서

    좋은 웹페이지 즐겨찾기