2015-02-03 5 views
0

Maxscript에서 효율성에 어떤 영향을 줍니까? Maxscript는 느린 것이지만 얼마나 영향을 주는지 궁금합니다.Maxscript에서 값/참조 성능 비교를 통해 전달 하시겠습니까?

나는이 스크립트를 시도했지만, 배열에서 연산을 실행하는 데 많은 시간이 걸렸지 만, 나중에 함수 호출은 0에서 시간 diference로 빠르게 돌아왔다 (배열에서 매우 높은 항목 수를 시도했다) .

fn testear lista = 
(
    a = 1 + 2 
) 

fn testear2 &lista = 
(
    a = 1 + 2 
) 

fn inicio = 
(
    lista = #() 

    for i = 1 to 1000000 do 
    (
     append lista "hola" 
    ) 

    strTime = timeStamp() 
    testear(lista) 
    endTime = timeStamp() 
    format "\ninicio % final % -> diferencia %\n" strTime endTime (endTime - strTime) 

    strTime = timeStamp() 
    testear2(&lista) 
    endTime = timeStamp() 
    format "\ninicio % final % -> diferencia %\n" strTime endTime (endTime - strTime) 

    for i = 1 to lista.count do 
     deleteItem lista 1 

) 

inicio() 

답변

0

배열에 함수를 전달하면 자동으로 참조로 전달됩니다. 이 두 기능은 똑같은 일을합니다. 이것을 시도하십시오 :

fn test1 arr = (
    arr[1] = "test1" 
) 
fn test2 &arr = (
    arr[1] = "test2" 
) 
fn init = (
    testArray = #(1,2,3,4,5,6,7,8,9,0) 
    format "Test #1: %\n" testArray 
    test1 testArray 
    format "Test #2: %\n" testArray 
    test2 &testArray 
    format "Test #3: %\n" testArray 

) 
init() 

알림 'testArray'는 테스트 기능에 의해 변경되고 변경 사항은 테스트 기능 범위 밖에서 반영됩니다.

그러나 배열 작업에는 많은 시간이 걸릴 수 있습니다. 코드에서와 같이 배열에 추가하면 기본적으로 새 항목을 추가 할 때마다 배열 복사본이 만들어집니다. 배열의 모든 항목이 가장 긴했다 삭제

lista=#() 
lista[1000000] = "" 
for i = 1 to 1000000 do 
(
    lista[i] = "hola" 
) 

,하지만 난 당신이 그렇게 할 필요가 있다고 생각하지 않습니다

더 빠른 방법은 처음에 필요 배열을 크기를 생성하는 것입니다. Maxscript는 가비지 수집을 많이하므로 스크립트가 끝나면 그 메모리를 비워야합니다. 어쩌면 당신은 이것을 시도 할 수 있습니다 :

for i = 1 to lista.count do 
(
    lista[i] = undefined 
) 
lista = undefined 

그러나 다시, 나는 그것이 필요하다고 생각하지 않습니다. 기본 제공 가비지 수집 기능을 호출 할 수 있습니다.

gc() 

희망 사항은 귀하의 질문에 대한 답변입니다.

+0

위대한 답변입니다. 아직 시도하지는 않았지만 유용합니다. 대신에 그 함수를 여러 번 호출하려고했지만 시간이 너무 비슷했습니다 ... 대신이 함수를 사용해 보겠습니다. – darkgaze