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

这些package require行实际上并不比它们委托给的loadsource调用花费的时间长很多(所有包所做的都是阻止您对所有内容的路径进行硬编码,处理版本的所有细节等等)。但是,当您package require搜索一个名称未知的包时,Tcl 必须实际搜索pkgIndex.tcl描述如何实际加载包的文件。它通过调用您可以使用 查找(或在必要时替换)的代码来做到这一点,package unknown这实际上非常慢。根据TCLLIBPATH环境变量的内容,它可能会非常慢。

但是我们可以“编译”它,这样我们就可以生成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运行它,那么这些呼叫将很快。(这也包括任何依赖于您列出的软件包。)但是,如果您安装了要在列表中使用的新软件包,或更新软件包的版本,或移动它们,您将需要重新构建清单:它使您的代码更加不灵活,这就是我们默认不这样做的原因。package requirepackage require

于 2016-12-20T16:50:01.610 回答