golang 性能优化之累加哈希

很多时候性能问题总是发生在一些不起眼的地方。最近做一个性能问题分析的时候发现,一个函数里面使用由于字符串拼接产生的临时字符串导致内存上涨了40%(120G 内存的机器),而这些临时字符串给 GC 也带来了非常大的负担,成为主要的性能瓶颈,而这些字符串作为 map 的 key,又必须要拼接,所以想到了直接使用 hash 后的值作为 map 的 key,而这个 hash 值使用累加 hash 计算得出。

所谓累加 hash,就是对字符串的 hash 可以分为任意多段,对每一段连续 hash,结果累加,对于任意一种分段方式,最后能得到一致的 hash 结果,比如:H.hash("hello world"), H.hash("hello").hash(" ").hash("world"), H.hash("hello wo").hash("rld)" 这些结果最后都应该是一致的,利用这个特性,就能做到对多个字符串哈希而不用拼接

BKDR hash 实现

type StringHasherBKDR uint64

// NewStringHasherBKDR 创建一个新的 Hasher
func NewStringHasherBKDR() StringHasherBKDR {
    return StringHasherBKDR(0)
}

// AddStr 增加一个字符串
func (bkdr StringHasherBKDR) AddStr(str string) StringHasherBKDR {
    val := uint64(bkdr)
    for i := 0; i < len(str); i++ {
        val = val*131 + uint64(str[i])
    }
    return StringHasherBKDR(val)
}

// AddInt 添加一个 int 值
func (bkdr StringHasherBKDR) AddInt(i uint64) StringHasherBKDR {
    val := uint64(bkdr)
    val = val*131 + i
    return StringHasherBKDR(val)
}

// Val 转成 uint64 的值
func (bkdr StringHasherBKDR) Val() uint64 {
    return uint64(bkdr)
}

使用上也很简单

hasher := NewStringHasherBKDR()
So(hasher.AddStr("hello world").Val(), ShouldEqual, hasher.AddStr("hello").AddStr(" ").AddStr("world").Val())

参考链接

转载请注明出处

本文链接:http://www.hatlonely.com/2018/04/12/golang-%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96%E4%B9%8B%E7%B4%AF%E5%8A%A0%E5%93%88%E5%B8%8C/

原文地址:https://www.cnblogs.com/hatlonely/p/8809756.html

时间: 2024-10-14 20:14:35

golang 性能优化之累加哈希的相关文章

Memcached哈希性能优化(八)——总结报告

转自:http://m.blog.csdn.net/blog/hzwfz1989/39120005 Memcached哈希性能优化报告 一. Memcached分析 这两个月一直在memcached优化和找工作之间忙着,一边复习一边优化改代码还真是个让人觉得难以忘记的夏天.做这个项目确实收获了很多,不管是对Linux的系统的认识,还是对memcached的认识都比以前更近一步,另外后面由于添加分块hash,替换LRU算法和更改hash算法对源代码进行修改,一不小心就把原来的代码的测试改跪了,用g

Spark性能优化指南——高级篇

Spark性能优化指南--高级篇 [TOC] 前言 继基础篇讲解了每个Spark开发人员都必须熟知的开发调优与资源调优之后,本文作为<Spark性能优化指南>的高级篇,将深入分析数据倾斜调优与shuffle调优,以解决更加棘手的性能问题. 数据倾斜调优 调优概述 有的时候,我们可能会遇到大数据计算中一个最棘手的问题--数据倾斜,此时Spark作业的性能会比期望差很多.数据倾斜调优,就是使用各种技术方案解决不同类型的数据倾斜问题,以保证Spark作业的性能. 数据倾斜发生时的现象 绝大多数tas

Android应用程序性能优化Tips

主要介绍一些小细节的优化技巧,虽然这些小技巧不能较大幅度的提升应用性能,但是恰当的运用这些小技巧并发生累积效应的时候,对于整个App的性能提升还是有不小作用的.通常来说,选择合适的算法与数据结构会是你首要考虑的因素,在这篇文章中不会涉及这方面的知识点.你应该使用这篇文章中的小技巧作为平时写代码的习惯,这样能够提升代码的效率. 通常来说,高效的代码需要满足下面两个原则: 不要做冗余的工作 尽量避免执行过多的内存分配操作 To ensure your app performs well across

C#实用杂记-EF全性能优化技巧

原文链接:http://www.makmong.com/947.html#comment-31 EntityFramework 优化建议 2016年1月15日 下午4:54 LEILINKANG Entity Framework目前最新版本是6.1.3,当然Entity Framework 7 目前还是预览版,并不能投入正式生产环境,估计正式版16年第一季度会出来,了解过EF7的部分新特性后,还是狠狠期待一下滴. EF性能问题一直为开发者所诟病,最让人纠结的也是这块,所以此次我也来谈谈EF的性能

Redis各种数据结构性能数据对比和性能优化实践

很对不起大家,又是一篇乱序的文章,但是满满的干货,来源于实践,相信大家会有所收获.里面穿插一些感悟和生活故事,可以忽略不看.不过听大家普遍的反馈说这是其中最喜欢看的部分,好吧,就当学习之后轻松一下. Redis各种数据结构性能数据对比 测试工具:perf4j 性能指标:平均值,最小值,最大值,方差 对比将814条数据按单条插入到哈希MAP和哈希SET: 对比从814条数据的哈希MAP和哈希SET中判断一个元素是否存在(map的hasKey和set的isMember): 大量数据插入哈希MAP,运

Entityframework 性能优化

在谈谈EF的性能优化之前请允许笔者废话几句.虽然说笔者以前有接触EF,但真正意义上的接触EF算是今年的8月份吧!那时公司里面有一个产品模块化的项目需要用到ORM.当时有两个选择1.EF,2.NHibernate. 说实在的两者的口碑都不怎么样...最后我还是支持了下微软的EF,毕竟做.Net开发用自家的会方便很多把.一开始在网上查得的一些博文会说EF各种性能不好!(PS:今天跟客户谈项目的时候又被喷了)不过我还是傻里傻气的保持乐观的态度,性能不好就想办法让它好起来!!!不做怎么知道呢!下面我一些

Linux网络性能优化方法简析

Linux网络性能优化方法简析 2010-12-20 10:56 赵军 IBMDW 字号:T | T 性能问题永远是永恒的主题之一,而Linux在网络性能方面的优势则显而易见,这篇文章是对于Linux内核中提升网络性能的一些优化方法的简析,以让我们去后台看看魔术师表演用的盒子,同时也看看内核极客们是怎样灵活的,渐进的去解决这些实际的问题. AD:2014WOT全球软件技术峰会北京站 课程视频发布 对于网络的行为,可以简单划分为 3 条路径:1) 发送路径,2) 转发路径,3) 接收路径,而网络性

前端性能优化归纳总结

关于前端性能优化的总结,随处都可以看到这方面的文章,而优化方法,也无外乎那些"固定"方面,当然,有些方面已经过时,所以,在这里,我自己也总结一遍吧,加深理解,也希望是一种不同的总结形式. -----------------------正文总这里开始------------------------------------ 一.什么是前端性能优化(what)? 从用户访问资源到资源完整的展现在用户面前的过程中,通过技术手段和优化策略,缩短每个步骤的处理时间从而提升整个资源的访问和呈现速度.

java性能优化之字符串

Java程序性能优化之代码优化 字符串部分: 关于这一部分我们需要了解String StringBuffer StringBulider String是一个不可变字符序列,针对常量池优化,类是final的 String的不变性是指字符串对象一旦创建便不可改变. 常量池的优化是指若两个字符串拥有相同的字符串序列,则在常量池只有一份拷贝. String类是final的则意味着不能对String类进行继承或者修改 String实际上是由三部分组成char数组和偏移量以及字符串长度组成 实际上字符sub