Ожидаемый TCL: upvar против производительности переменных пространства имен

Есть ли ожидаемая, по спецификации / реализации, разница между доступом к переменным пространства имен и upvar. Я должен использовать функцию обратного вызова. Я не могу просто передать аргумент. Эмпирически, апвар побеждает. Но ожидается ли это во всех разумных случаях? Благодарю.

1 ответ

Решение

Определенно да. ссылка в полном объеме быстрее, чем upvar ссылка, которая быстрее, чем 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}

Выход:

toto::cb_scoped =>    0.47478505 microseconds per iteration
toto::cb_variable =>  0.7644891 microseconds per iteration
toto::cb_upvar =>     0.6046395 microseconds per iteration

Рем: огромное количество итераций требуется для получения согласованного результата.

Другие вопросы по тегам