2016-06-08 1 views
0

См Tcl 8.4 ниже код и вывод оболочки ниже: (нужно мета- кодирование):TCL кажется медленнее, чем набор, при получении значения переменной из переменной с именем переменной

% set k a 
% set m k 
% puts [set $m ] 
a 
% puts [subst $$m] 
a 

Итак, это что set $m и subst $$m имеют одинаковую функциональность. Тем не менее, во время выполнения (в простом TestCase) довольно сильно отличается (см продолжение результатов оболочки ниже:

% time { set $m } 1000000 
0.256435 microseconds per iteration 
% time { subst $$m } 1000000 
0.627714 microseconds per iteration 

Как можно видеть, установлен в ~ 2,5 быстрее, чем SUBST 2 вопроса:., Чтобы спросить: 1. Почему?
2. Я видел, что это ~ 3,6 быстрее в Tcl 8.5. можно ли ожидать, что это будет оставаться так, в будущих версиях?
Благодаря

+0

и будем держать это в перспективе: мы говорим меньше одной микросекунды. –

+0

Правда. Но что произойдет, если вам придется это делать сотни миллионов раз? – user1134991

+0

Ну, половина микросекунды за итерацию раз 500 миллионов итераций составляет около 4 минут. Конечно, стоит посмотреть, но, вероятно, не ваше самое узкое место. –

ответ

3

Вы можете ожидать вещей, чтобы остаться точно При использовании:

puts [set $m] 

Tcl скомпилирует это сообщение после чтения переменной m (сохраняя результат во внутреннем стеке операций), считывая переменную, имя которой находится в стеке операций, а затем вызов puts с результатом.

Когда вы делаете:

puts [subst $$m] 

Tcl компилирует, что конкатенация $ и результатов чтения m, вызов замены двигателя (который, в свою очередь, будет разобрать и байткод компилировать этот фрагмент) и только затем puts результата. Что совершенно сложнее.

Вы бы увидели разницу, если вы сделали:

set m {k[exit]} 

Первым будет просто сказать вам, что вы пытаетесь читать из (странно названия) переменного, которая не существует. Второй ушел бы из процесса.

+0

На самом деле, разница в скорости будет больше в Tcl 8.6, чем в 8.5, так как «subst» непостоянных строк получил удар по производительности. С другой стороны, 'subst' строк _constant_ получил повышение производительности. (Это связано с тем, как все было включено для механизма нерекурсивной оценки.) –

+1

Определяли бы, что -nocommands и -nobackslashes вообще помогают? –

+0

@glennjackman Наверное, не очень; что просто изменяет то, что происходит в ответ на '' и '\', но их все равно нужно разбирать (поскольку мы не свопируем парсер прямо сейчас). У вас все еще есть дополнительный синтаксический разбор с 'subst' (с генерацией байт-кода в 8.6) в дополнение к поиску переменных, требуемому в обоих случаях. Если используются имена динамических переменных, обычно лучше «upvar 0» их фиксировать локальный псевдоним ... –

Смежные вопросы