Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

其中map分别使用java原生HashMap及基于堆外内存的map实现

堆外内存的HashMap由于使用开地址法,需要设置bucket数量,本实验中按照每10个元素分配一个bucket


实验目标

堆外内存map与java原生HashMap在以下方面的性能:

...

原生HashMap堆外内存hashMap
594_212 record / s696_427 record / s

堆外内存hashmap快的原因是它一开始就固定了分区,不会随着插入rehash,内存拷贝次数少

查询性能(get)

原生HashMap堆外内存hashMap
795_924 record / s701_283 record / s

堆外内存hashmap bucket数量手动优化的很好,每次查询复杂度为10个record,查询复杂度不高,但是由于其序列化和反序列化耗时,故查询性能稍差

内存占用

原生HashMap堆外内存hashMap
1.48GB1.15 GB

堆外内存hashmap节省了内存中每个record的HashMap Node的32字节的内存占用,共10M个record,故节省了320MB左右的内存

实验结论

(1)堆外哈希表需要手动设置bucket数量,且之后不能动态扩容,在预先知道record数量的时候进行合理调参,插入时不用rehash,可以在插入性能上超过原生哈希表

(2)堆外哈希表每次查询都需要反序列化,导致查询性能不如原生HashMap

(3)堆外哈希表的性能很大程度上取决于bucket的数量是否设置合理,太小会导致写入和查询性能下滑,太大会浪费内存,在record数量不确定的情况下bucket参数不好确定

(4)内存占用方面堆外哈希表节省了原生HashMap Node的内存开销,每时间序列可以减少32字节内存开销