彼らは同じ変数について話しています。 ::var
フォームでは、完全修飾名を使用していますが、global
のフォームでは、グローバル変数(は実際にはがグローバル変数へのポインタです)へのローカルリンクを作成しています。それを読んだり書いたりするのは、どちらを選んでも全く同じです。
2つの間に測定可能な差異があります。 global
を使用すると、リンクを設定するための余分なコストがかかりますが、残りの手順では、1回の使用あたりのコスト(読み込みまたは書き込み)がかなり低くなります。もう1つのフォームでは、セットアップのオーバーヘッドは払っていませんが、使用あたりのコストは高くなります。 1つの用途にのみ、2つのコストはかなり似ています。変数を複数回使用している場合は、global
が安いです。 OTOHでは、速度の低下にもかかわらず、とにかく完全修飾バージョンを使用することが明白です(特にvwait
とtrace
に該当)。
::env
アレイと::tcl_platform
アレイには完全修飾フォームを使用してアクセスしますが、他のほとんどのものはglobal
でアクセスします。それは私の好みです。
ここでの例では、対話型セッションです:
% set x 1
1
% proc y1 {} {incr ::x;return ok}
% time { y1 } 10000
0.5398216 microseconds per iteration
% proc y2 {} {global x;incr x;return ok}
% time { y2 } 10000
0.4537753 microseconds per iteration
% proc z1 {} {return $::x}
% time { z1 } 10000
0.4864713 microseconds per iteration
% proc z2 {} {global x; return $x}
% time { z2 } 10000
0.4433554 microseconds per iteration
(私はあなたが私と同じ絶対数値を得るために期待していない、独自のパフォーマンステストを行い、私は同様の相対数字を期待します。 ...)
私はvncを使用しているので、各フォームの実際の作業時間を測定することは非常に不正確です... – user2141046