0

以下のように、Tcl コード内で使用される多くのパッケージが必要です。

package require tlautils 1.0
package require profilemanager
package require tla::log 1.2
package require res_mgr 1.1
package require resource 1.2
package require sysexits
package require utils 1.5
package require testutil 1.0
package require profilemgr
package require leakChecker
package require testutil

非常に多くのパッケージが必要とする代わりに使用する代替手段は何ですか? これには時間がかかり、秒/ミリ秒単位で時間を増やす必要があるパッケージの他の代替手段を探しています

4

1 に答える 1

3

行は、それらが委譲するand呼び出しpackage requireよりも実際にはそれほど長くはかかりません(すべてのパッケージが行っているのは、バージョンのすべての詳細を処理するなどして、すべてへのパスをハードコーディングする必要をなくすことです)。ただし、名前がまだわかっていないパッケージを実行する場合、Tcl は実際にパッケージをロードする方法を記述したファイルを実際に検索する必要があります。これは、 を使用して検索 (または必要に応じて置換) できるコードを呼び出すことによって行われますが、これは実際には非常に低速です。環境変数の内容によっては、非常に遅くなる可能性があります。loadsourcepackage requirepkgIndex.tclpackage unknownTCLLIBPATH

しかし、それを「コンパイル」してsource、単一のファイルにできるようにし、これらの特定のパッケージをこのマシンにすばやくロードできるようにすることができます。

そのためには、上記package requireの s と追加のラッピング コードが必要です。

package require tlautils 1.0
package require profilemanager
package require tla::log 1.2
package require res_mgr 1.1
package require resource 1.2
package require sysexits
package require utils 1.5
package require testutil 1.0
package require profilemgr
package require leakChecker
package require testutil

set f [open "pkgdefs.tcl" w]
foreach pkg [package names] {
    # Skip the packages built directly into Tcl 8.6
    if {$pkg in {zlib TclOO tcl::tommath Tcl}} continue

    # Get the actual loaded version; known but absent would be an error
    if {[catch {package present $pkg} version]} continue

    # Get the actual script that we'd run to load the package.
    set script [package ifneeded $pkg $version]

    # Add to the file
    puts $f [list package ifneeded $pkg $version $script]
}
close $f

それを実行すると、スクリプトpkgdefs.tclができsourceます。将来、リストした呼び出しのいずれかを実行sourceする前にそれを実行すると、それらの呼び出しは高速になります。(これには、リストしたパッケージの依存関係にあるパッケージも含まれます。) ただし、リストで使用する新しいパッケージをインストールしたり、パッケージのバージョンを更新したり、パッケージを移動したりする場合は、パッケージを再構築する必要があります。 list: コードの柔軟性が大幅に低下するため、デフォルトではこれを行いません。package requirepackage require

于 2016-12-20T16:50:01.610 に答える