预期的TCL:upvar vs namespace变量性能

时间:2018-02-08 14:13:11

标签: namespaces tcl upvar

根据规范/实现,是否存在访问命名空间变量与upvar之间的差异。 我必须使用回调函数。我不能只是通过一个论点。实际上,upvar赢了。但是,在所有合理的情况下,这是预期的吗? 感谢。

1 个答案:

答案 0 :(得分:2)

肯定是的。完全范围的引用比dput(df) structure(list(name = c("a", "value", "b", "value", "c", "value" ), x = c(NA, 1L, NA, 2L, NA, 3L)), .Names = c("name", "x"), row.names = c(NA, -6L), class = "data.frame") 引用快于upvar引用。

要查找,命令'time'是你的朋友:

variable

输出:

namespace eval toto {
    proc cb_upvar {varname} {
        upvar $varname var
        incr var
    }

    proc cb_scoped {varname} {
        incr $varname
    }

    proc cb_variable {varname} {
        variable $varname
        incr $varname
    }
}

proc benchmark {cmd} {
    set toto::totovar 1
    time $cmd 100
    puts -nonewline "[lindex $cmd 0] =>\t"
    puts [time $cmd 20000000]
}

puts [info tclversion]
benchmark {toto::cb_scoped ::toto::totovar}
benchmark {toto::cb_variable totovar}
benchmark {toto::cb_upvar totovar}

Rem:需要大量的迭代才能获得一致的结果。