性能比较:一个参数还是一组参数? 我定义了一个新的TCL命令,它的实现是C++。该命令用于查询数据流,语法如下: mycmd <arg1> <arg2> ... mycmd。。。
这个命令的思想是获取一个参数列表,并返回一个列表,其中包含每个参数的相应数据 我的同事评论说,最好只使用一个参数,当需要多个值时,只需多次调用该命令 还有一些其他的讨论,但有一点我们不能同意,那就是性能 我认为我的版本,参数列表应该更快,因为当我们需要多个参数时,通过TCL解释器只需要一次开销 他的评论对我来说是新的-性能比较:一个参数还是一组参数? 我定义了一个新的TCL命令,它的实现是C++。该命令用于查询数据流,语法如下: mycmd <arg1> <arg2> ... mycmd。。。,tcl,Tcl,这个命令的思想是获取一个参数列表,并返回一个列表,其中包含每个参数的相应数据 我的同事评论说,最好只使用一个参数,当需要多个值时,只需多次调用该命令 还有一些其他的讨论,但有一点我们不能同意,那就是性能 我认为我的版本,参数列表应该更快,因为当我们需要多个参数时,通过TCL解释器只需要一次开销 他的评论对我来说是新的- 函数实现被缓存 访问TCL函数比访问TCL数据更快 这个理由合理吗 如果使用Tcl_EvalObjv调用该命令,则不会通过Tcl解释器。成本将是一次哈希表查找(如果您重用包含命令
这个理由合理吗 如果使用
Tcl_EvalObjv
调用该命令,则不会通过Tcl解释器。成本将是一次哈希表查找(如果您重用包含命令名的Tcl_Obj*
),那么您将参与该命令的实现。否则,构造一个列表Tcl\u Obj*
(例如,使用Tcl\u NewListObj
)然后调用Tcl\u EvalObj
)几乎和这是一种特例一样便宜,因为列表构造代码保证生成的列表也是无替换命令。
构建一个普通字符串并通过Tcl_Eval
(或Tcl_EvalObj
)传递该字符串的速度要慢得多,因为必须对其进行解析。(OTOH,将相同的Tcl_Obj*
连续多次通过Tcl_EvalObj
将更快,因为它将在内部编译为字节码。)
如果这些值的内部表示形式与访问函数所需的类型相匹配,则访问值(即访问Tcl_Obj*
references)的速度非常快。如果存在不匹配,则可能会调用内部类型转换函数,而且它们通常比较昂贵。要理解内部表示,请考虑以下几点:
-unicode字符数组字符串
-一个C整数
(除非你进行任意精度的工作)长
-引用的数组列表
-将dict
映射到Tcl\u Obj*
Tcl\u Obj*
-字节编码版本脚本
-指向实现功能的指针命令
time
命令非常适合这种性能分析工作(这就是它的设计目的)。如果你是用C或C++调用的,使用那个语言的性能测量习惯用法(我不知道,但是会搜索堆栈溢出)。
我自己?我建议编写API时要尽可能清晰。描述实际操作,不要扭曲一切,试图挤出额外0.01%的性能。你认为呢?你为什么不去衡量呢?当你有疑问的时候去运行“推理正确吗?”的问题是这些陈述是正确的,但不一定与性能相关。