一般的に言えば、Tclから最高のパフォーマンスを引き出すには、コードをプロシージャに入れる必要があります。(ラムダ項やクラスメソッドなど、8.5および8.6にはさらにいくつかの関連オプションがありますが、これらはプロシージャに密接に関連しています。)他にもいくつか注意する必要があります。
- 式を(
expr {$a + $b}
ではなくexpr $a + $b
)中かっこで囲むと、はるかに効率的なコンパイル戦略が可能になります。
- チャネルエンコーディングを慎重に選択してください。(そうすると、そのチャネルは文字ではなくバイト
fconfigure $chan -translation binary
を転送します。ただし、8.4のバイト指向チャネルではあまり効率的ではありません。使用するとほとんどの利点が得られます。)gets
-encoding iso8859-1 -translation lf
- Tclはチャネルバッファリングを非常にうまく行います。
- さまざまなバージョンのTclを使用してコードをベンチマークし、どれが最適に機能するかを確認することをお勧めします。テストのためだけに複数のTclインタープリターをインストールするという(マイナーな)面倒な作業をしたくない場合は、テストにtclkitビルドを使用してみてください。
行指向の変換を行う慣用的な方法は次のとおりです。
proc transformFile {sourceFile targetFile RE replacement} {
# Open for reading
set fin [open $sourceFile]
fconfigure $fin -encoding iso8859-1 -translation lf
# Open for writing
set fout [open $targetFile w]
fconfigure $fout -encoding iso8859-1 -translation lf
# Iterate over the lines, applying the replacement
while {[gets $fin line] >= 0} {
regsub -- $RE $line $replacement line
puts $fout $line
}
# All done
close $fin
close $fout
}
ファイルが十分に小さく、すべてがメモリに簡単に収まる場合は、一致-置換ループ全体がCレベルに引き上げられるため、これはより効率的です。
proc transformFile {sourceFile targetFile RE replacement} {
# Open for reading
set fin [open $sourceFile]
fconfigure $fin -encoding iso8859-1 -translation lf
# Open for writing
set fout [open $targetFile w]
fconfigure $fout -encoding iso8859-1 -translation lf
# Apply the replacement over all lines
regsub -all -line -- $RE [read $fin] $replacement outputlines
puts $fout $outputlines
# All done
close $fin
close $fout
}
最後に、正規表現は必ずしも文字列の照合を行うための最速の方法ではありません(たとえば、string match
はるかに高速ですが、はるかに制限されたタイプのパターンを受け入れます)。あるスタイルの置換コードを別のスタイルに変換し、それを非常に高速に実行することは、100%簡単ではありません(REは非常に柔軟です)。