Tie::IxHash是如何在Perl中实现的?

Tie::IxHash是如何在Perl中实现的?,perl,Perl,我最近在Perl中遇到了一种情况,使用保序散列将使我的代码更可读、更易于使用。经过一番搜索,我发现了Tie::IxHash CPAN模块,它正是我想要的。在我放弃谨慎并开始使用它之前,我想更好地了解它是如何工作的,以及我可以从中获得什么样的性能 据我所知,有序关联数组通常以尝试的方式实现,我以前从未实际使用过,但我知道它们的性能符合我的预期(我希望进行大量读写,并且需要始终记住最初插入的顺序键)。我的问题是,我不知道这是否是Tie::IxHash的制作方式,或者我应该从中获得什么样的性能,或者是

我最近在Perl中遇到了一种情况,使用保序散列将使我的代码更可读、更易于使用。经过一番搜索,我发现了Tie::IxHash CPAN模块,它正是我想要的。在我放弃谨慎并开始使用它之前,我想更好地了解它是如何工作的,以及我可以从中获得什么样的性能

据我所知,有序关联数组通常以尝试的方式实现,我以前从未实际使用过,但我知道它们的性能符合我的预期(我希望进行大量读写,并且需要始终记住最初插入的顺序键)。我的问题是,我不知道这是否是Tie::IxHash的制作方式,或者我应该从中获得什么样的性能,或者是否有更好/更干净的选择适合我(我真的不想保留一个单独的数组和散列来完成我需要的,因为这会产生丑陋的代码和空间效率低下)。我也只是出于好奇而好奇。如果它不是作为trie实现的,它是如何实现的?我知道我可以涉猎源代码,但我希望其他人已经这么做了,我猜我不是唯一对答案感兴趣的人

所以。。。思想?建议?建议?

将告诉您此功能是如何实现的,以及如何衡量其性能

对象是以一种直接的方式实现的,使用人们期望的常规Perl构建块。具体来说,这样的对象是一个包含4个元素的数组引用

  • [0]
    存储用户散列密钥的散列引用。在模块需要检查是否存在密钥时,可随时使用此选项

  • [1]
    一个数组引用,用于按顺序存储用户散列的键

  • [2]
    一个并行数组引用,用于按顺序存储值

  • [3]
    一个整数,用于跟踪两个并行阵列中的当前位置。这是迭代所需要的


就表现而言,一件好东西通常比投机更值钱。我的猜测是,删除会对性能造成最大的影响,因为保存有序键和值的数组需要调整。

我在问题中特别指出,我认为在这里讨论答案对我和其他有相同问题的人都很有用。我知道我可以涉过它的来源,但这给我的印象是,人们应该更容易获得它。如果我是模块的作者,我会把它放在文档中,但因为我不是,所以这里讨论是我下一个最好的选择。然后看看前60行。这会告诉你90%的你想知道的。但是如果我们在这里有100%我想知道的,而不是用我在最初的问题中已经注意到的答案和评论把这个话题搞得乱七八糟,不是更好吗?但是如果我们在这里有100%我想知道的,而不是把这个话题搞得乱七八糟,不是更好吗关于我在原始问题中注意到的答案和评论,请参见moritz的ie::Hash::Indexed(),它将自己描述为类似于Tie::IxHash,但使用XS和twices编写,速度也一样快。我尝试了这一点,它比IxHash更快地完成了我需要的一切。遗憾的是,它没有安装在我被迫使用的服务器上的库中,而且我被告知不允许安装它,所以我只能使用Tie::IxHash。我自己做了一些调查和基准测试,并认为在这里提及结果可能有用。基本上,所有正常的散列操作都是O(1),除了delete,delete是O(n),并且在处理大散列时会变得非常慢,因为整个[0]散列经过删除的项需要重新排序。移位甚至更慢,因为它以θ(n)运行(总是需要n次迭代)。我看到的所有其他标准数组和散列操作都是O(1),所以基本上,只要不删除或移位(找到一种使用push的方法),它就是一个非常好的模块。