大佬教程收集整理的这篇文章主要介绍了加速 Tcl 评估,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我目前正在编写一个基于 Tcl 的符号矩阵操作工具,但代码越来越慢。我正在寻找加速 Tcl 代码(Tcl 8.6 版)的方法。
我有一个怀疑。我的代码使用命令名称作为第一个元素和命令参数作为以下元素构建列表(这来自模拟面向对象的方法)。我使用 eval
来调用这些命令(这通常在递归处理中完成)。我在 https://wiki.tcl-lang.org/page/eval 和 https://wiki.tcl-lang.org/page/Tcl+Performance 读到 eval
可能很慢。
我有三个问题:
从包含命令名称和参数的列表中调用命令的最快方法是什么?
是否会加速代码以将命令名称 myCmd
和参数列表 myPar
分开并使用 [$myCmd {*}$myPar]
调用命令(建议在 https://stackoverflow.com/a/27619692/3852630) ?
使用 if 1
而不是 eval
的技巧在 8.6 中仍然有希望吗?
非常感谢您的帮助!
关于K
and unsharing objects的说明
避免在内存中复制数据。改变
set mylist [linsert $mylist 0 some new content]
到
set mylist [linsert $mylist[set mylist ""] 0 some new content]
这会取消引用变量的值,然后将变量设置为 空字符串。这减少了变量的引用计数。
另见https://stackoverflow.com/a/64117854/7552
,最重要的是,不要假设:time
是肯定的。请注意,对重复运行某事物的事物进行计时可能会改变运行它所需的时间(因为缓存预热)。仔细考虑您希望实际获得什么速度。
eval
命令通常很慢,但并非在所有情况下。如果您给它一个您已经构建的列表(例如,使用 list
或 linsert
或 lappend
或...),那么它相当快,因为它可以避免重新解析输入;它知道,但仅在那种情况下,它可以直接跳到分派到命令实现。另一种比较快的情况是当你给它一个之前给 eval
; 的值时。字节码已经构建和缓存。这些说明也适用于 uplevel
。
执行 $myCmd {*}$myParameters
也相当快;它被字节编码为“在 Tcl 操作数堆栈上组装单词并执行正确的命令分派”,这与任意用户命令的情况非常接近(很少有直接的字节码实现)。
我希望 if 1
在某些情况下会非常快,而在其他情况下会很慢;它强制完全编译,因此如果可以很好地缓存内容,那么速度会很快,如果不能,则速度会很慢。如果你只是调用一个命令,它充其量也不会产生太大影响。它获胜的情况是当被调用的事物本身是一个字节码命令并且您可以正确缓存事物时。
如果您正在处理一个普通命令(例如,一个过程,或一个 Tcl 的与操作系统相关的命令),我会选择选项 2:$myCmd {*}$myParameters
或它的变体。它与您将要获得的速度一样快。但我不会这样做:
set myParameters [linsert $myOriginalValues 0 "literal1" [cmdOutput2] $value3]
$myCmd {*}$myParameters
这太荒谬了。这更清晰、更干净、更快:
$myCmd "literal1" [cmdOutput2] $value3 {*}$myOriginalValues
扩展语法 ({*}
) 的部分要点在于您不需要进行复杂的参数编组,这很好,因为复杂性很难始终正确。
以上是大佬教程为你收集整理的加速 Tcl 评估全部内容,希望文章能够帮你解决加速 Tcl 评估所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。