很多有特别追求性能上的一直执着 特别是在语言的区别
exp:
C系跑的快 ,Java 跑的慢。
所以我们追求一些底层业务业务性能时应该以理论上的最优C系为实现。例如网络通讯呀,而放弃些面向对象的设计。
今天无聊使用C实现了一个HashMap 和使用Java 的hashMap 实践分析了下。
注意了C的实现是我自己实现的 而hashMap Doug Lea大佬写的。
长话短说,核心代码在rehash 上的区别
C

在重散列过程中,无条件地移动每个元素到新的桶(通过计算得出的新索引)确实会造成一定的开销,尤其是当哈希表的大小变得非常大时。每次重散列,你都需要遍历整个哈希表中的所有元素,并计算它们在新哈希表中的位置,然后将它们插入到新位置。即使使用头插法可以相对快速地将元素插入到新的链表中,这个遍历和重新计算索引的过程本身就是一个完整的线性操作,其时间复杂度为 O(n),其中 n 是元素的数量
******** 所以这里是只用到了链表的头插法 这个的头插法最大的问题是 如果目标是否要移动 它都会被移动 ,就是
[1] x -> x1 -> x2 。假如 x1其实不需要移动 头插法还是会把 x1 插入到x 前面
Java

而JAVA是尾推 + 整体链表移动
我们不考虑JAVA 的红黑带来的性能优势。
在100万的基数上
C
是0.18
JAVA
是 0.145
更优 虽然JAVA 有红黑 + 更好的 hash 算法 但实践证明 相比与语言 算法和结构的选择 会大于语言所带来的性能优势。
exp:
C系跑的快 ,Java 跑的慢。
所以我们追求一些底层业务业务性能时应该以理论上的最优C系为实现。例如网络通讯呀,而放弃些面向对象的设计。
今天无聊使用C实现了一个HashMap 和使用Java 的hashMap 实践分析了下。
注意了C的实现是我自己实现的 而hashMap Doug Lea大佬写的。
长话短说,核心代码在rehash 上的区别
C

在重散列过程中,无条件地移动每个元素到新的桶(通过计算得出的新索引)确实会造成一定的开销,尤其是当哈希表的大小变得非常大时。每次重散列,你都需要遍历整个哈希表中的所有元素,并计算它们在新哈希表中的位置,然后将它们插入到新位置。即使使用头插法可以相对快速地将元素插入到新的链表中,这个遍历和重新计算索引的过程本身就是一个完整的线性操作,其时间复杂度为 O(n),其中 n 是元素的数量
******** 所以这里是只用到了链表的头插法 这个的头插法最大的问题是 如果目标是否要移动 它都会被移动 ,就是
[1] x -> x1 -> x2 。假如 x1其实不需要移动 头插法还是会把 x1 插入到x 前面
Java

而JAVA是尾推 + 整体链表移动
我们不考虑JAVA 的红黑带来的性能优势。
在100万的基数上
C
是0.18JAVA
是 0.145更优 虽然JAVA 有红黑 + 更好的 hash 算法 但实践证明 相比与语言 算法和结构的选择 会大于语言所带来的性能优势。













