通过Maxscript中的值/参考性能比较?

时间:2015-02-03 15:44:01

标签: performance 3dsmax maxscript

它如何影响Maxscript的效率? Maxscript是一个缓慢的,但我想知道它有多大影响?

我试过这个脚本,花了很多时间来执行数组中的操作,但是后来对函数的调用快速返回0到时间差异(我在数组中尝试了非常高的项目数)。

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()

1 个答案:

答案 0 :(得分: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()

希望能回答你的问题。