2016-07-27 4 views
0

私はTCLにSWを持っています。 異なる名前空間に変数を設定および/または照会する必要があります。TCLの名前空間変数にアクセスする最速の方法

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

するか、私には、例えば、同じことを達成するための手順を使用する必要があります。 私は(exampeleのために)使用する必要がありますか?

namespace1::setVarname1 $val 
namespace1::getVarname1 

どの検索が高速ですか? 2番目の方法は間違いなく安全です。
TCL 8.5を使用しており、今後TCL 8.6にアップグレードします。
ありがとうございます。

+0

http://stackoverflow.com/a/372​​96301/974155 – Dinesh

+0

同様の質問ですが、同じではありません。 1は、グローバルではなく変数を使用するprocを呼び出しています。 – user1134991

答えて

1

あなたが手順にある場合は、最速の方法は、ローカル変数として名前空間の変数をマッピングするためにglobalvariableupvarまたはnamespace upvarを使用することです。あるいは、変数に複数回アクセスする(読み書きする)場合は、少なくとも最速です。上のコマンドのどれを使うかは、あなたがやっていることに依存しますが、スピードに対してかなりの違いがありますが、定数の変数名についてはそれほど重要ではありません。ラムダの用語やクラスのメソッドにも同じことが言えます。それは同じ根底にあるメカニズムです。

プロシージャの外で、変数が存在する名前空間でまだ実行していない場合は、アクセスの最速の方法は完全修飾名を使用することです。 (Tclは名前の内部表現に名前の解析をキャッシュしますが、これはかなり高速になります)。一方、現在の名前空間の変数であれば、修飾されていない名前を使用する方が少し速いかもしれません。変数リゾルバのトラブルを防ぐために、以外の名前空間の場合は、variableコマンドで変数を宣言してください。

全体として、ここで質問するのではなく、自分で見つけることができます。 timeコマンドは、テストは非常に簡単です:

% 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 

あなたはあなたコードを確認する必要があります。私のタイミングとあなたのものが同じであるとは思わないでください。

関連する問題