shines77 / jstd_hashmap

C++ high performance hash table
Other
1 stars 1 forks source link

benchmark #1

Open ktprime opened 2 years ago

ktprime commented 2 years ago

https://github.com/martinus/map_benchmark

shines77 commented 2 years ago

非常感谢你的分享,我知道你的,也知道你是国人,前几天搜到过你的代码,开始还以为是外国人,后来在知乎上知道你是国人。

另外,我有点好奇,你是怎么知道我这个仓库的。。

https://github.com/martinus/map_benchmark 粗略的看了一下,还不错。

目前我的 jstd::flat16_hash_map 只是试验性初级版本,当前测试是不如 absl::flat_hash_map 和 ska::flat_hash_map,但这两个的性能也不是很好。

我准备重写以前的版本 jstd::Dictionary ,因为以前写得比较乱,且理念不够清晰,所以我重建了一个仓库,准备重构一下,等我完成了再加到这个 benchmark 里试一下。当前的 jstd::Dictionary 版本我自己会私下用这个 benchmark 试一下,不过旧的代码有些地方是不合格的,比如没有针对 <int, int> <size_t, size_t> 优化,这种情况可以不保存 hash_code,直接比较 key,这样也更省内存,指针也可以改为 index,甚至只保留 next 指针或索引,以前有这个想法,但没实现,等我重新完成吧。

ktprime commented 2 years ago

没事经常搜索是否有新的hashmap 实现,我git上收集了10个左右第三方测试代码,有复杂和简单的。可以加入你的测试

ktprime commented 2 years ago

最近测试我改进的swiss table- emilib2/3. 我的实现查询性能比官方慢20%,插入则快20%,一直分析对比查找哪里查询慢(我在乎查询性能),一个区别在于我使用线性探测,而swiss table使用二次探测,还有你之前说的swiss做了随机内存地址优化,这些难道是主要原因?

-------------------------------- function benchmark -----------------------------------------------
erase_50
  85        emilib3                100.0%
  95        emilib2                89.9%
  97        absl_flat              87.5%

erase_reinsert
  62        absl_flat              100.0%
  88        emilib3                70.1%
 100        emilib2                62.2%

find_erase_50
  79        absl_flat              100.0%
  94        emilib3                84.1%
  99        emilib2                80.3%

find_hit_0
  85        absl_flat              100.0%
  92        emilib2                92.8%
  98        emilib3                87.2%

find_hit_100
  83        absl_flat              100.0%
  94        emilib2                88.5%
  97        emilib3                85.7%

find_hit_50
  85        absl_flat              100.0%
  93        emilib2                91.3%
  97        emilib3                87.2%

find_hit_50_erase
  91        absl_flat              100.0%
  94        emilib3                97.2%
  98        emilib2                92.9%

hash_iter
  44        emilib2                100.0%
  44        emilib3                99.0%
 100        absl_flat              44.3%

insert_erase
  71        emilib3                100.0%
  86        absl_flat              82.9%
  97        emilib2                73.0%

insert_find_erase
  76        emilib3                100.0%
  93        emilib2                81.6%
  96        absl_flat              79.0%

insert_hit
  93        emilib3                100.0%
  96        emilib2                96.4%
  97        absl_flat              96.0%

insert_l1_cache
  33        emilib2                100.0%
  35        emilib3                94.5%
 100        absl_flat              33.5%

insert_l3_cache
  86        emilib3                100.0%
  89        emilib2                97.2%
  97        absl_flat              89.0%

insert_no_reserve
  94        emilib3                100.0%
  95        absl_flat              99.7%
  96        emilib2                97.9%

multi_small_ife
  84        emilib3                100.0%
  93        emilib2                90.8%
  95        absl_flat              88.5%

======== hash  top1   top2  top3 =======================
    absl_flat  2.0   4.0   22
      emilib2  0.0  22.0    6
      emilib3 26.0   2.0    0
======== hash    score  weigh ==========================
    absl_flat    85     92.4%
      emilib2    88     95.0%
      emilib3    93     100.0%
--------------------------------------------------------------------
ktprime commented 2 years ago

最新测试结果出来了,可以看看 https://martin.ankerl.com/2022/08/27/hashmap-bench-01/