Performance Tcl源代码与Tcl包
假设我不想给出每个源代码中的完整路径,什么时候我会选择tcl包而不是tcl源代码?包需要比源更快吗Performance Tcl源代码与Tcl包,performance,tcl,Performance,Tcl,假设我不想给出每个源代码中的完整路径,什么时候我会选择tcl包而不是tcl源代码?包需要比源更快吗 我知道是什么软件包保护我们两次不获取代码,这是个问题吗?我只采购函数,所以我不介意两次采购函数,但这是否存在性能问题?当然存在性能问题。 考虑一下运行源命令时会发生什么: 必须打开提供给源命令的路径。 操作系统检查路径的权限,解析符号链接。 这对于你的特殊情况来说是次要的。 对于一些反复检查文件路径的应用程序来说,这可能是一个重大打击 (例如,网络服务器) 该文件已读入。 磁盘I/O。总是很慢
我知道是什么软件包保护我们两次不获取代码,这是个问题吗?我只采购函数,所以我不介意两次采购函数,但这是否存在性能问题?当然存在性能问题。 考虑一下运行源命令时会发生什么:
- 必须打开提供给源命令的路径。
操作系统检查路径的权限,解析符号链接。 这对于你的特殊情况来说是次要的。 对于一些反复检查文件路径的应用程序来说,这可能是一个重大打击 (例如,网络服务器) - 该文件已读入。 磁盘I/O。总是很慢
- 对文件进行解析和解释。
解析总是很慢。
Tcl有一个简单的规则集,因此它的解析速度可能比其他一些规则集要快 - 因为你的功能被替换了。。。 这里的问题是字节码编译器现在忘记了任何优化 该功能将在第一次运行时比平时运行得慢 它被使用
观点:你会发现人们只是说,“获得更好的硬件”。这些人都是傻瓜,这就是为什么大多数网络速度如此之慢的原因。他们不必要地浪费资源。看看你的核心问题:
软件包要求的速度是否比源代码快
它们不具有直接可比性。
包是比脚本文件更高级的概念,您可以source
,通常通过source
调用一个或几个文件来实现。还有一种缓存机制,因此当您第一次执行包require
时,它肯定会比source
慢很多(因为如果包管理子系统无法识别您所要的包,它需要搜索您所拥有的包,这实际上涉及到在许多pkgIndex.tcl
文件上使用source
)对包require
的后续调用可能会更快,因为包不会加载两次。一旦建立了内部索引(通常每个解释器花费一次),包require
对已知但未加载的包的调用不会比直接源代码
加载其实现文件慢多少。除此之外“更高级别”发生的事情:包可能根本不是由您可以源代码实现的,而是使用DLL的加载。或者它可以混合使用。这就是包的业务:您通常需要知道的是功能有一个名称和版本。这与直接源代码不同,您不需要这样做o准确地知道代码的位置(如果代码位于已知的固定位置或相对于当前脚本的位置,则很容易),并且该文件正是您所需要的。通常,最好从实现中拆分策略(例如,包要求foobar 1.2.3
)(例如,源代码-编码utf8/usr/local/lib/tcl/packages/foobar_1.2.3/foobar.tcl
)
包是一次性的结果是,它们不用于创建对象和类似对象的对象的实例(API中有效记录的单例除外)。包需要
来获取构造命令(可能是类)然后使用这些命令在需要时生成所需的实例