在 Maxscript 中按值/参考性能比较传递?

Pass by value / reference performance comparison in 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()

如果将数组传递给函数,它会自动作为引用传递。这两个函数在做同样的事情。试试这个:

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

希望这能回答您的问题。