Повышение и повышение производительности TCL

Допустим, у меня есть переменная на один уровень выше, и я просто хочу запросить ее значение. У меня есть два варианта:
uplevel { set var_name }
Или же:
upvar var_name
Если мне нужно запросить переменную только один раз, а не изменять ее, какая из них должна быть быстрее?

2 ответа

Решение

Вы обнаружите, что это, вероятно, быстрее для этого. Не обязательно, но скорее всего. (Если вас беспокоит производительность, альтернативы.) Обратите внимание, что они оба обязательно должны разрешить имя переменной; это цена, которую все равно придется нести. Но версия с не требует перемещения кода между контекстами, поэтому, вероятно, будет быстрее.

FWIW, когда я пытаюсь использовать приведенный ниже пример, моя интуиция верна. (Ключ в том, что используется байт-код опкода; другой делает , который работает медленнее, потому что это общий диспетчер команд и имеет кучу накладных расходов, необходимых для других целей.)

      % proc foo {y} {set x 1; bar $y}
% proc bar {y} {upvar 1 x x; list $x $y}
% foo 2
1 2
% time {foo 2} 10000
17.8188412 microseconds per iteration
% proc bar {y} {set x [uplevel 1 {set x}]; list $x $y}
% foo 2
1 2
% time {foo 2} 10000
25.4614022 microseconds per iteration

я предпочитаю timerate для такого рода микробенчмаркинга:

      % namespace import ::tcl::unsupported::timerate
% timerate -calibrate {}
0.03257451263357219 µs/#-overhead 0.032807 µs/# 59499506 # 30481304 #/sec
% proc foo {y} {set x 1; bar $y}
% proc bar {y} {upvar 1 x x; list $x $y}
% timerate {foo 2} 10000
0.437240 µs/# 21285016 # 2287075 #/sec 9306.651 net-ms
% proc bar {y} {set x [uplevel 1 {set x}]; list $x $y}
% timerate {foo 2} 10000
0.612693 µs/# 15497439 # 1632137 #/sec 9495.179 net-ms

(Ответ ясен: используйте upvar).

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