优化 TCL 二进制扫描以解析 TCP 数据包负载

问题描述 投票:0回答:1

我正在使用类似于以下代码的二进制扫描来迭代 TCP 有效负载:

set offset 42
binary scan ${payload} @${offset}c some_len
inr offset 1

# do something here

incr offset ${some_len}

binary scan ${payload} @${offset}S someother_len
incr offset 2
set nested_offset 0
set nested_cnt 0
set my_list [list]
while { [expr {${nested_offset} < ${someother_len}}] } {
  binary scan ${payload} @${offset}H4 some_hex
  if { [lsearch -sorted -inline ${checklist} $some_hex] eq "" } {
    lappend my_list ${some_hex}
    incr nested_cnt
  }
  incr cipher_offset 2
  incr field_offset 2
}

binary scan ${payload} @${offset}S third_len
incr offset 2

# do something else here
#...many more binary scans with incremented offsets.


我的问题是尽可能优化这段代码。

目前此 tcl 代码平均执行约 1.4M CPU 周期。

我已经做了相当多的研究,并考虑在可能的情况下实现 K 组合器,但到目前为止还没有成功,因为每次尝试这样做都会导致 TCL 错误。我做了一些其他更改,但未能显着提高性能。

您是否看到我可以对此代码进行任何明显的更改?当我迭代它时,有什么方法可以缩短 $payload 吗?

binary tcl
1个回答
0
投票

首先要尝试的绝对是将要测量的代码放入过程中。这可以实现许多优化(因为这意味着我们有一个可以通过索引访问的局部变量表)。

其次,

binary scan
实际上并没有进行深度优化。使用
string range
获取要解析的字符串切片可能会更快(以及更简单的
binary scan
);在 Tcl 9.0 中它可能会更快,因为它可以进行高效的字符串切片。但这肯定需要测量;我的直觉可能是错误的!

第三,如果您正在搜索列表中是否存在值作为存在测试,那么将它们作为键放入字典中可能会更快(用于构建字典的一次性成本),然后使用

dict exists
来测试是否存在。字典由哈希表支持,因此可能相当快。再说一次,你需要测量来证实我的直觉。

© www.soinside.com 2019 - 2024. All rights reserved.