我有一个Emacs Lisp程序需要跟踪一组字符串,使用它们完成并测试其他字符串以获取集合中的成员资格。在大多数没有内置set
类型的语言中,我会使用带有虚拟t
或1
值的字典或哈希表,但我想到了Elisp的{{ 1}}类型也可以达到目的,obarray
,intern
和intern-soft
代替unintern
,puthash
和gethash
。
(我知道作为集合在列表上运行的remhash
函数,但这些函数与此问题并不特别相关,只需要设置成员资格测试。)
在现代Emacs中使用obarray而不是散列表是否有任何优势(在速度,内存使用或其他方面),或者是主要符号表之外的更多的遗留物,而不是Emacs Lisp之前的剩余部分哈希表类型?
答案 0 :(得分:7)
由于两者都有效,因此在很大程度上是品味或表现的问题。
就内存使用量(以单词计算)而言,obarray使用1个固定大小的数组N加上每个条目的一个符号(大小为6),而散列表的大小大约为每个元素5个再多一点。记忆中,它是一种清洗。
就速度而言,我不知道有谁费心去测量它,所以它可能也不是一个大问题。
IOW,这是一个品味问题。 FWIW,我更喜欢提供更多选项的哈希表;在我看来,obarrays在很大程度上是一次历史性事故。