性能比较:一个参数还是一组参数? 我定义了一个新的TCL命令,它的实现是C++。该命令用于查询数据流,语法如下: mycmd <arg1> <arg2> ... mycmd。。。

性能比较:一个参数还是一组参数? 我定义了一个新的TCL命令,它的实现是C++。该命令用于查询数据流,语法如下: mycmd <arg1> <arg2> ... mycmd。。。,tcl,Tcl,这个命令的思想是获取一个参数列表,并返回一个列表,其中包含每个参数的相应数据 我的同事评论说,最好只使用一个参数,当需要多个值时,只需多次调用该命令 还有一些其他的讨论,但有一点我们不能同意,那就是性能 我认为我的版本,参数列表应该更快,因为当我们需要多个参数时,通过TCL解释器只需要一次开销 他的评论对我来说是新的- 函数实现被缓存 访问TCL函数比访问TCL数据更快 这个理由合理吗 如果使用Tcl_EvalObjv调用该命令,则不会通过Tcl解释器。成本将是一次哈希表查找(如果您重用包含命令

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

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

还有一些其他的讨论,但有一点我们不能同意,那就是性能

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

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

  • 函数实现被缓存
  • 访问TCL函数比访问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*
    • 脚本
      -字节编码版本
    • 命令
      -指向实现功能的指针
    好的,这些不是确切的类型(通常还有其他簿记数据),但它们是您应该认为的模型

    至于“哪一个最快”,回答这个问题的唯一明智的方法就是尝试一下,看看哪一个是真正最快的:对于没有实际代码的人来说,答案将取决于太多的因素。如果您是从Tcl调用的,
    time
    命令非常适合这种性能分析工作(这就是它的设计目的)。如果你是用C或C++调用的,使用那个语言的性能测量习惯用法(我不知道,但是会搜索堆栈溢出)。
    我自己?我建议编写API时要尽可能清晰。描述实际操作,不要扭曲一切,试图挤出额外0.01%的性能。

    你认为呢?你为什么不去衡量呢?当你有疑问的时候去运行“推理正确吗?”的问题是这些陈述是正确的,但不一定与性能相关。