2016-07-27 20 views
0

Ich habe SW in TCL. Ich muss Variablen in einem anderen Namespace festlegen und/oder abfragen. Soll ich (für exampele) verwenden:Schnellste Möglichkeit zum Zugriff auf Namespace-Variablen in TCL

global ::namespace1::varname1 
set ::namespace1::varname1 $val 
##more code to access/write into a variable 

Oder soll ich Verfahren, das gleiche zu erreichen, zum Beispiel?

namespace1::setVarname1 $val 
namespace1::getVarname1 

Welches Lookup ist schneller? Die 2. Methode ist definitiv sicherer.
Wir verwenden TCL 8.5, und wird in der Zukunft zu Tcl 8.6
Dank aktualisieren.

+0

http://StackOverflow.com/a/37296301/974155 – Dinesh

+0

Ähnliche Frage, aber nicht das Gleiche. 1 ruft einen proc auf, der eine Variable verwendet, nicht global. – user1134991

Antwort

1

Wenn Sie in einem Verfahren sind, ist der schnellste Weg global, variable, upvar oder namespace upvar abzubilden den Namespace-Variable als lokale Variable zu verwenden. Zumindest ist es am schnellsten, wenn Sie die Variable mehr als einmal aufrufen (lesen oder schreiben); Die genaue Wahl, welche der oben genannten Befehle zu verwenden ist, hängt davon ab, was Sie tun, und in einigen Fällen kann ein großer Unterschied zur Geschwindigkeit machen, aber für konstante Variablennamen spielt es keine Rolle. Gleiches gilt auch für Lambda-Terme oder Klassenmethoden; Es ist derselbe zugrunde liegende Mechanismus.

Wenn Sie außerhalb einer Prozedur nicht bereits im Namespace ausgeführt werden, von dem die Variable stammt, ist der schnellste Zugriff wahrscheinlich der vollständig qualifizierte Name. (Tcl speichert den Parse des Namens in der internen Repräsentation des Namens, was die Dinge ein wenig beschleunigen wird.) Andererseits, wenn es eine Variable im aktuellen Namespace ist, dann könnte die Verwendung des unqualifizierten Namens etwas schneller sein . Vorausgesetzt, Sie haben die Variable mit dem Befehl variable (für andere Namespaces als ::) deklariert, um Probleme mit dem Variablen-Resolver zu vermeiden.

Insgesamt, anstatt nur hier zu fragen, können Sie es selbst herausfinden. Der time Befehl macht das Testen sehr einfach:

% info patch 
8.5.9 
% set x 1 
1 
% time {incr x} 10000 
0.3075357 microseconds per iteration 
% time {incr ::x} 10000 
0.3728569 microseconds per iteration 

Sie mit Ihre Code überprüfen sollten; gehe nicht davon aus, dass meine Zeit und deine die gleichen sind.