2013-03-20 68 views
0

我正在定義一個新的TCL命令,它的實現是C++。該命令來查詢數據流和語法是這樣的:性能比較:一個參數或參數列表?

mycmd <arg1> <arg2> ... 

的想法是這個命令需要的參數列表並返回它針對每個參數對應的數據的列表。

我的同事評論說最好只使用一個參數,當需要多個值時,多次調用該命令。

還有一些其他的討論,但我們不能同意的一件事是表現。

我認爲我的版本,參數列表應該更快,因爲當我們想要多個參數時,這是TCL解釋器的一次性成本。

他的評論是我新 -

  1. 功能實現緩存
  2. 訪問TCL功能比訪問TCL數據

這是推理的聲音更快?

+3

你覺得呢?你爲什麼不衡量? – 2013-03-20 21:42:11

+0

run [benchmark](http://tcllib.sourceforge.net/doc/bench.html)疑問時 – Alec 2013-03-21 02:05:43

回答

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*
  • 哈希表210 - bytecoded
  • command版本 - 指向實現功能

OK,這些都不是確切的類型(有經常其他簿記數據也是如此),但他們在做什麼,你應該想到的模型。

至於「哪個最快」,回答這個問題的唯一理想方法是嘗試一下,看看哪一個最真實:答案取決於太多因素,而沒有實際的代碼來預測它。如果你從Tcl調用,time命令對於這種性能分析工作來說是完美的(這是它的設計目的)。如果您使用C或C++進行調用,請使用該語言的性能度量標準(我不知道但會搜索堆棧溢出)。

我自己?我建議儘可能將API編寫爲清除乾淨的。描述實際的操作,並且不要扭曲一切,試圖擠出0.01%的額外性能。

+0

問題與「是推理的聲音?」是這些陳述是真實的,但不一定與性能相關。 – 2013-03-21 07:25:00