在Emacs Lisp中使用obarray而不是散列表有什么好处吗?

时间:2014-08-08 17:35:15

标签: emacs elisp

我有一个Emacs Lisp程序需要跟踪一组字符串,使用它们完成并测试其他字符串以获取集合中的成员资格。在大多数没有内置set类型的语言中,我会使用带有虚拟t1值的字典或哈希表,但我想到了Elisp的{{ 1}}类型也可以达到目的,obarrayinternintern-soft代替uninternputhashgethash

(我知道作为集合在列表上运行的remhash函数,但这些函数与此问题并不特别相关,只需要设置成员资格测试。)

在现代Emacs中使用obarray而不是散列表是否有任何优势(在速度,内存使用或其他方面),或者是主要符号表之外的更多的遗留物,而不是Emacs Lisp之前的剩余部分哈希表类型?

1 个答案:

答案 0 :(得分:7)

由于两者都有效,因此在很大程度上是品味或表现的问题。

就内存使用量(以单词计算)而言,obarray使用1个固定大小的数组N加上每个条目的一个符号(大小为6),而散列表的大小大约为每个元素5个再多一点。记忆中,它是一种清洗。

就速度而言,我不知道有谁费心去测量它,所以它可能也不是一个大问题。

IOW,这是一个品味问题。 FWIW,我更喜欢提供更多选项的哈希表;在我看来,obarrays在很大程度上是一次历史性事故。