性能比较:一个参数或一个参数列表?

时间:2013-03-20 21:41:12

标签: tcl

我正在定义一个新的TCL命令,其实现是C ++。该命令用于查询数据流,语法如下:

mycmd  <arg1>  <arg2> ...

这个想法是这个命令获取一个参数列表并返回一个列表,其中包含每个参数的相应数据。

我的同事评论说,最好只使用一个参数,当需要多个值时,只需多次调用该命令。

还有其他一些讨论,但有一点我们不能互相认同,那就是表现。

我认为我的版本,参数列表应该更快,因为当我们需要多个参数时,通过TCL解释器需要一次性费用。

他的评论对我来说是新的 -

  
      
  1. 函数实现已缓存
  2.   
  3. 访问TCL功能比访问TCL数据更快
  4.   

这个推理听起来了吗?

1 个答案:

答案 0 :(得分:0)

如果使用Tcl_EvalObjv来调用命令,则不会通过Tcl解释器。成本将是一个哈希表查找(或更少,如果您重用包含命令名称的Tcl_Obj*),然后您将执行该命令。否则,构建列表Tcl_Obj*(例如,使用Tcl_NewListObj)然后调用Tcl_EvalObj几乎同样便宜,因为这是一个特例,因为列表构造代码保证生成也是无替换命令的列表。 构建一个普通字符串并通过Tcl_Eval(或Tcl_EvalObj)传递该字符串要慢得多,因为必须对其进行解析。 (OTOH,连续多次将相同的 Tcl_Obj*传递给Tcl_EvalObj将更快,因为它将在内部编译为字节码。)

访问值(即进入Tcl_Obj*引用)非常快,提供这些值的内部表示与访问函数所需的类型相匹配。如果存在不匹配,则可以调用内部类型转换功能,并且它们通常相对昂贵。要了解内部表示,请参考以下几点:

  • string - unicode字符数组
  • integer - 一个C long(除非你进行任意精确的工作)
  • list - Tcl_Obj*引用数组
  • dict - 将Tcl_Obj*映射到Tcl_Obj*
  • 的哈希表
  • script - 字节码版本
  • command - 指向实现函数的指针

好的,那些不是确切的类型(通常还有其他簿记数据),但它们是你应该想到的模型。

对于“哪个是最快的”,回答问题的唯一理智方法是尝试并查看哪个是真实的最快:答案将取决于没有实际代码预测它的任何人的太多因素。如果你从Tcl调用,time命令非常适合这种性能分析工作(它就是它的设计目的)。如果您使用C或C ++进行呼叫,请使用该语言的性能测量习惯用法(我不知道,但会搜索Stack Overflow)。

自己?我建议尽可能将API编写为清除。描述实际操作,不要扭曲所有内容,试图挤出额外0.01%的性能。