我有许多包需求,在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
使用什么替代方案而不是使用这么多包需要?这需要时间,我正在寻找包装需要的任何其他替代方案,以秒/毫秒增加时间
答案 0 :(得分:3)
package require
行并不比他们委派的load
和source
来电更长时间(所有包裹正在做的就是阻止你不得不努力 - 编码所有内容的路径,处理版本的所有细节等等)。 但是,当您对名称尚未知的软件包package require
执行时,Tcl必须实际搜索描述如何实际加载软件包的pkgIndex.tcl
文件。它通过调用您可以使用package unknown
查找(或在必要时替换)的代码来实现此目的,而且实际上非常慢。根据{{1}}环境变量的内容,它可能非常慢。
但我们可以“编译”这样,以便我们能够TCLLIBPATH
一个文件,并能够快速加载这台特定的软件包。
为此,我们需要上面的source
和一些额外的包装代码:
package require
运行后,您可以在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 require
来电将会很快。 (这还包括与您列出的软件包相关的任何软件包。)但是,如果您安装了要在列表中使用的新软件包,或者更新软件包的版本,或者移动它们,那么您需要重建列表:它使您的代码更加不灵活,这就是为什么我们默认不这样做。