在 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()
希望这能回答您的问题。
它如何影响 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()
希望这能回答您的问题。