如果您使用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%的額外性能。
你覺得呢?你爲什麼不衡量? – 2013-03-20 21:42:11
run [benchmark](http://tcllib.sourceforge.net/doc/bench.html)疑問時 – Alec 2013-03-21 02:05:43