expl3“数据类型”的效率和速度

expl3“数据类型”的效率和速度

语境:出于教学目的,我计划在 expl3 中实现二叉树(请不要使用“用另一种语言实现”注释)。我想知道是否要使用标记列表或 clist 或其他不同的东西。

观察:在浏览这里的一些问题时,一次又一次地出现这样的评论关于一些 expl3 方法的速度。有趣的是,并非所有这些方法都记录在 中interface3.pdf

问题:特定参数说明符(或它们的转换)的处理是否比其他的慢,并且一些“数据类型”(clist、seq、str、tl)是否比其他的快?

如果它太宽泛(因为它听起来像“如何加速 l3 代码”)那么请在评论中提及它,我会尝试询问具体的方法。

答案1

这里有三件事要记住。首先,从根本上讲,expl3无法扩展 TeX 本身可用的原始数据类型:宏、寄存器和一些其他特殊情况(大小写转换代码、字体尺寸、ETC。)。其次,can 和 has 的实现细节expl3已经改变:文档化的接口是稳定的。因此,这里的任何答案都可能改变。最后,“效率”可能意味着不同的事情。人们可能会担心 csname 的使用效率、随机访问速度、映射速度,ETC。而这些事情可能取决于可能的规模。

综上所述,我们可以检查一下数据类型就像现在一样。最基本的是tl,它是宏中存储的包装器。它可以保存“任何东西”,但没有预定义的结构。本质上,它们的速度与存储令牌的速度一样快。(这里有一个问题:tl数据以原始术语存储在 中\edef{\unexpanded{<content>}},它允许使用#令牌,但非常比 稍慢\toks<number>={<content}。)

持有 token 的其他数据类型(目前)被实现为tl具有内部结构的单个持有者。对于 来说,这一点最为明显(这在很大程度上是用户输入操作的快捷方式),但对于和clist也是如此。(注意:后者多年来至少有三种不同的实现。)这个案例很好地说明了“效率意味着什么?”的问题:使用一个意味着你可以有很多seqproppropcsnamepropprop数据,但对于大量 keyval,它们比其他方法更慢。这种名称使用方面的优化是拥有数据类型的最初原因(在 e-TeX 之前),但也意味着它们可以快速复制,ETC。

对于专业应用程序,通常有一些巧妙的技巧可以加快数据访问速度。例如,Bruno 最近添加了一个快速整数数组结构来支持l3regex,该结构以fontdimen数据为核心。不过,要向其他人完全解释这些可能有些棘手。

该团队致力于开发更灵活的数据结构,包括平衡不同形式的效率。如果您需要实施建议,最好在 LaTeX-L 上询问,或者当然可以咨询source3

答案2

通常,您会期望 seq 比 clist 更高效,因为它在内部设置为处理序列,相反,clist 是一个逗号分隔的列表,因此它设置为方便用户使用逗号分隔符输入,然后需要对其进行解析/删除才能遍历列表。str/tl 实际上无法进行比较,因为它们没有实现任何类型的列表数据结构。

从某种意义上说,当然一切都是 tl,因为标记列表是 TeX 唯一真正的结构。

但是如果您只需要一对数据类型来构建二叉树,那么是否使用两个项目 tl 或两个项目 seq 是一个选择问题,tl 基本上不会给您任何东西,您需要构建二进制数据类型。seq 会为您提供更多用于迭代序列和选择项目的函数,但如果您的所有序列长度都是 2,可能会有点过度。

您可能还想考虑使用具有左属性和右属性的 prop 来建模树,这可能更具可读性。

相关内容