Tcl upvar 性能改进与直接传递
Tcl upvar performance improvement vs. direct pass
这与 Tcl 8.5 有关
假设我有一本非常大的字典。
从性能的角度来看(内存占用等),假设我不修改字典,upvar 是否应该在内存方面提供巨大的性能改进?我正在使用具有 TCL shell 的 EDA 工具,但供应商禁用了 TCL 内存命令。我知道 Tcl 可以在后台共享字符串以提高性能......同一个字典可以传递多个嵌套过程的调用。
谢谢。
我想在引擎盖下,字典在写入之前不会被复制,所以如果没有写入那么你应该没问题。如果您想绝对确定,请使用全局变量。
proc myproc {} {
global mydictionary
}
只要您不修改字典,它就不会提供太多明显的性能差异或内存消耗差异。
Tcl 通过不可变引用传递值,并在您对它们进行更新时复制它们(如果它们是共享的,例如,在全局变量和局部变量之间(过程形式参数是局部变量))。如果您从不更改任何内容,那么您将使用共享引用,一切都会很快。如果你确实需要改变一些东西,你应该使用 upvar
或 global
(或更奇特的变体之一)为调用者's/global 变量创建局部变量别名并通过那,因为那是最快的。但是,如果您要更改值,这只是一个问题。
这与 Tcl 8.5 有关 假设我有一本非常大的字典。 从性能的角度来看(内存占用等),假设我不修改字典,upvar 是否应该在内存方面提供巨大的性能改进?我正在使用具有 TCL shell 的 EDA 工具,但供应商禁用了 TCL 内存命令。我知道 Tcl 可以在后台共享字符串以提高性能......同一个字典可以传递多个嵌套过程的调用。 谢谢。
我想在引擎盖下,字典在写入之前不会被复制,所以如果没有写入那么你应该没问题。如果您想绝对确定,请使用全局变量。
proc myproc {} {
global mydictionary
}
只要您不修改字典,它就不会提供太多明显的性能差异或内存消耗差异。
Tcl 通过不可变引用传递值,并在您对它们进行更新时复制它们(如果它们是共享的,例如,在全局变量和局部变量之间(过程形式参数是局部变量))。如果您从不更改任何内容,那么您将使用共享引用,一切都会很快。如果你确实需要改变一些东西,你应该使用 upvar
或 global
(或更奇特的变体之一)为调用者's/global 变量创建局部变量别名并通过那,因为那是最快的。但是,如果您要更改值,这只是一个问题。