2016-07-13 3 views
2

성능이 중요한 프로젝트의 테이블에 요소를 삽입해야하기 때문에 어떤 방법이 더 빠른 방법인지 알아야했습니다. 다음 코드를 실행했습니다 :t [#t + 1] = e가 table.insert (t, e)보다 왜 빠릅니까?

local total = 0 

local mytable = {} 

for i = 1, 1e7 do 
    local clock = os.clock 
    local push = table.insert 
    local t = clock() 

    push(mytable, 0) 

    t = clock() - t 
    total = total + t 
end 

print("table.insert: "..total) 

local total = 0 

local mytable = {} 

for i = 1, 1e7 do 
    local clock = os.clock 
    local t = clock() 

    mytable[#mytable + 1] = 0 

    t = clock() - t 
    total = total + t 
end 

print("Manual approach: "..total) 

그리고 두 번째 방법은 첫 번째 방법보다 약 2 초 빠릅니다.

첫 번째 함수는 함수 호출이지만 두 번째 함수는 # 연산자를 호출하고 추가 작업을 수행 한 다음 값에 인덱스를 할당합니다. 모두 루아 쪽에서 수행합니다. 그것은 C면에 있습니다.

왜 두 번째 방법이 더 빠릅니까? 기능이 정말 느린가요?

+3

'I = I + 1; t [i] = e'는 훨씬 더 빠릅니다. –

+5

루프 밖에서 시계 물건과'local push = table.insert'를 움직이십시오. 그렇다면 아마도 전역 변수에 대한 액세스를 측정하고있을 것입니다. 모든 것은 나를 위해 약 3 배 빠릅니다. 그리고 나는 두 가지 접근 방식이 7 % 차이가납니다. – lhf

+1

@Egor Skriptunoff 당신은 내가 테이블의 길이를 포함하는 변수를 유지해야한다는 것을 의미합니까? – user6245072

답변

0

함수 호출. 다음 코드를 표시합니다. 이 코드는 귀하의 코드를 기반으로합니다.

function insert(t, v) 
    t[#t + 1] = v 
end 

for i = 1, 1e7 do 
    local clock = os.clock 
    local t = clock() 

    --mytable[#mytable + 1] = 0 
    insert(mytable, 0) 

    t = clock() - t 
    total = total + t 
end 

코드 작업은 동일하지만 하나의 함수 호출로 증가합니다.

결과 시간 table.insert이다 : 4.705

수동 접근법 : 4.752 < - 삽입 기능