对于最小内存,应该给Tcl dict赋予什么价值?

时间:2014-10-28 22:53:35

标签: memory dictionary tcl

我需要一本字典,“只是为了键”,也就是说,这些值不太重要。 哪个值会消耗最少的内存? “0”“”,还有什么? 感谢。

2 个答案:

答案 0 :(得分:6)

Tcl在封面下共享常量,因此只要它是文字就可以使用几乎任何东西。但是空字符串几乎肯定会在你的脚本中成为预定义的常量(即使你没有注意到它)并且非常短。或者使用单字符的字母数字字符串,这将生成一个较短的字符串形式的字典(否则几乎没有区别)。当然,0是单字符的字母数字字符串。

在我自己的代码中,我主要使用"dummy value"之类的值作为值。在大多数情况下,成本只是几个字节,但对我来说它更清楚它并不意味着什么,所以如果我回到代码后来我不想弄清楚我在做什么...... {/ p>

答案 1 :(得分:1)

不是答案,但我认为更好地表达为一个而不是评论中的延续......

我在上面的评论中遵循了关于list和dict键搜索的比较效率的论点,我想我会做一些测试并展示结果。

我构建了一个包含一百万个键的字典,一个包含一百万个条目的数组和一个包含字典键的列表:

for {set i 0} {$i < 1000000} {incr i} {
    set idx [expr rand()]
    incr arr($idx)
    dict incr dic $idx
}
set rands [dict keys $dic]

顺便说一句,除最终set rands...外,这需要大约5.88秒。

然后,我定时在列表中使用lsearch搜索不同的随机数,使用dict exists搜索字典键,使用info exists arr()搜索包含以下1000次迭代结果的数组:

lsearch $rands [expr rand()]      26349.115 microseconds per iteration
dict exists $dic [expr rand ()]      14.357 microseconds per iteration
info exists arr([expr rand()])       14.652 microseconds per iteration

有趣。这并不奇怪,但我确实希望看到一些数字。

然后我重读了OP的最后一条评论,注意到对排序的引用,尝试对列表进行排序并使用lsearch -sorted。对列表进行排序大约需要一秒钟。

lsearch -sorted $sortedRands [expr rand ()]   19.304 microseconds per iteration

当你告诉它列表已经排序时,lsearch对排序列表的效果非常好。

但是,如果我省略-sorted选项,则更长

lsearch $sortedRands [expr rand()]     120206.369 microseconds per iteration
                                       123604.209 microseconds per iteration

我对此感到非常惊讶,我做了两次。我也重复了info exists arr(...并找到了与之前相同的结果,所以不仅仅是我的机器速度慢得多。

Doeas任何人都有任何想法为什么正常搜索排序列表是如此之慢?