Повышение и повышение производительности 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
).