2017-01-11 2 views
0

非常に最近では、namespaceの概念と、プログラム変数にダブルコロン(:) :)を使用したことが分かりました。ダブルコロンとグローバル変数の違いは?

すべてのスクリプトを再構成する前に、globalキーワードで変数にアクセスする場合と二重コロンの構文で実際の違いがあるかどうかを知りたいと考えました。
私は私の画面に書かれた 'BLA' を取得していますどちらの場合も
set var bla
proc kuku {} { puts $::var }


proc gaga {} {global var ; puts $var}

私には何が欠けていますか?
私は変数の編集に少し問題があることを理解しています(それは可能ですか?)が、読み取り専用の変数では2つの方法に違いはありますか?

答えて

1

彼らは同じ変数について話しています。 ::varフォームでは、完全修飾名を使用していますが、globalのフォームでは、グローバル変数(は実際にはがグローバル変数へのポインタです)へのローカルリンクを作成しています。それを読んだり書いたりするのは、どちらを選んでも全く同じです。

2つの間に測定可能な差異があります。 globalを使用すると、リンクを設定するための余分なコストがかかりますが、残りの手順では、1回の使用あたりのコスト(読み込みまたは書き込み)がかなり低くなります。もう1つのフォームでは、セットアップのオーバーヘッドは払っていませんが、使用あたりのコストは高くなります。 1つの用途にのみ、2つのコストはかなり似ています。変数を複数回使用している場合は、globalが安いです。 OTOHでは、速度の低下にもかかわらず、とにかく完全修飾バージョンを使用することが明白です(特にvwaittraceに該当)。

::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 

(私はあなたが私と同じ絶対数値を得るために期待していない、独自のパフォーマンステストを行い、私は同様の相対数字を期待します。 ...)

+0

私はvncを使用しているので、各フォームの実際の作業時間を測定することは非常に不正確です... – user2141046

関連する問題