相关疑难解决方法(0)

用于顺序键的更快的 HashMap

最初,我非常惊讶地发现HashMap,即使使用FNV哈希器,Rust 的速度也比 Java、.NET、PHP 中的等效项慢得多。我说的是优化的Release模式,而不是Debug模式。我做了一些计算,发现 Java/.NET/PHP 中的计时值低得令人怀疑。然后它击中了我 - 尽管我正在使用一个大哈希表(数百万个条目)进行测试,但我读取的主要是顺序键值(如14, 15, 16, ...),这显然导致了大量CPU 缓存命中,这是由于标准哈希表的方式(以及整数和短字符串的哈希码函数)在这些语言中被实现,因此具有附近键的条目通常位于附近的内存位置。

HashMap另一方面,Rust使用所谓的SwissTable实现,它显然以不同的方式分配值。当我测试随机键的阅读时,一切都井然有序——“竞争对手”的得分落后于 Rust。

因此,如果我们处于需要按顺序执行大量获取的情况,例如迭代一些有序且大部分是连续的(没有太多间隙)的 DB ID,是否有一个好的 Rust 哈希映射实现可以与 Java 竞争HashMap或者.NET 的Dictionary


PS 根据评论中的要求,我在这里粘贴一个示例。我运行了大量测试,但这里有一个简单的示例,在 Rust(发布模式)中需要 75 毫秒,在 Java 中需要 20 毫秒:

在铁锈中:

let hm: FnvHashMap<i32, i32> = ...;  
// Start timer here
let mut sum: i64 = 0;
for i in 0..1_000_000 {
    if let Some(x) = hm.get(&i) {
        sum += …
Run Code Online (Sandbox Code Playgroud)

performance hashmap rust

16
推荐指数
2
解决办法
1万
查看次数

标签 统计

hashmap ×1

performance ×1

rust ×1