Улучшение производительности Tcl Upvar против прямого прохода

Это относится к Tcl 8.5. Скажем, у меня очень большой словарь. С точки зрения производительности (объем памяти и т. Д.), Если предположить, что я не изменяю словарь, должен ли упвар обеспечивать значительное улучшение производительности с точки зрения памяти? Я использую инструмент EDA, который имеет оболочку TCL, но поставщик отключил команду памяти TCL. Я знаю, что Tcl может разделять строки под капотом для повышения производительности... В один и тот же словарь можно передавать несколько вызовов вложенных процедур. Благодарю.

2 ответа

Решение

Пока вы не изменяете словарь, он не обеспечит заметной разницы в производительности или потреблении памяти.

Tcl передает значения по неизменной ссылке и копирует их, когда вы записываете в них обновление, если они совместно используются, например, между глобальной переменной и локальной переменной (формальные параметры процедуры являются локальными переменными). Если вы никогда ничего не измените, вы будете использовать общую ссылку, и все будет быстро. Если вам нужно что-то изменить, вы должны использовать upvar или же global (или один из более экзотических вариантов), чтобы сделать псевдоним локальной переменной для переменной вызывающей / глобальной и изменить ее, так как это происходит быстрее всего. Но это только проблема, если вы собираетесь изменить значение.

Я полагаю, что под капотом словарь не копируется до тех пор, пока он не будет записан, поэтому, если нет записей, с вами все будет в порядке. Используйте глобальный, если вы хотите быть абсолютно уверены.

  proc myproc {} {
    global mydictionary
  }
Другие вопросы по тегам