itcl中包的要求是什么?

时间:2016-12-20 09:42:22

标签: tcl itcl

我有许多包需求,在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

使用什么替代方案而不是使用这么多包需要?这需要时间,我正在寻找包装需要的任何其他替代方案,以秒/毫秒增加时间

1 个答案:

答案 0 :(得分:3)

package require行并不比他们委派的loadsource来电更长时间(所有包裹正在做的就是阻止你不得不努力 - 编码所有内容的路径,处理版本的所有细节等等)。 但是,当您对名称尚未知的软件包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来电将会很快。 (这还包括与您列出的软件包相关的任何软件包。)但是,如果您安装了要在列表中使用的新软件包,或者更新软件包的版本,或者移动它们,那么您需要重建列表:它使您的代码更加不灵活,这就是为什么我们默认不这样做。