Golang
文章平均质量分 88
Junebao
去爱,去努力
展开
-
【译】TcMalloc: Thread-Caching Malloc
TcMalloc 的核心是分层缓存,前端没有锁竞争,可以快速分配和释放较小的内存对象(一般是 256 KB)前端有两种实现,分别是 pre-CPU 和 pre-Thread 模式,前者申请一块大的连续内存,每一个逻辑 CPU 将获得其中的一段。这种模式下 TcMalloc 通过保存额外的元数据来动态地调整每种大小类的实际缓存大小。Per-Thread 模式为每个线程分配一个本地缓存,线程缓存中每种大小类的可用对象通过链表连接。翻译 2022-11-06 23:11:02 · 583 阅读 · 1 评论 -
【Go】Map 的空间利用率统计
今天刷 B 站看见有 Up 主在讲布隆过滤器,提到了利用率的问题,假设有一组数据,范围分布非常广,使用布隆过滤器时如何尽量少的减少内存使用,感觉除了针对特定数据的定向优化外没什么特别好的办法,类似于 Google 那种加数据头以跳过大段间隙那样。然后想到类似的问题应该广泛存在于所有使用哈希表的数据结构中,那 go 中 map 的利用率如何呢?原创 2022-05-04 23:09:57 · 1710 阅读 · 0 评论 -
硬件内存模型 Hardware Memory Models
很久以前,当人们还在写单线程程序的时候,让程序跑的更快的一个最有效的办法就是什么也不做,因为下一代硬件和编译器的优化会使得程序更快但行为不发生改变。但是多年前的某一天,硬件工程师们发现让单个处理器越来越快的魔法消失了,与此同时,他们发现了一种新的魔法……翻译 2022-01-28 23:43:06 · 906 阅读 · 0 评论 -
[译] Bounds Check Elimination 边界检查消除
Go 是一种内存安全的语言,在针对数组 (array) 或 Slice 做索引和切片操作时,Go 的运行时(runtime)会检查所涉及的索引是否超出范围。如果索引超出范围,将产生一个 Panic,以防止无效索引造成的伤害。这就是边界检查(BCE)。边界检查使我们的代码能够安全地运行,但也会影响一定的性能。翻译 2022-01-06 23:49:57 · 266 阅读 · 0 评论 -
Go 1.18.1 Beta 尝鲜 泛型 FuzzTest workspace mode
go1.18 beta 终于发布了,快来看看泛型,模糊测试,workspace mode 这些期待已久的功能把原创 2021-12-16 00:33:02 · 939 阅读 · 0 评论 -
Go json 差异比较 json-diff(RFC6902)
Go json 差异比较 json-diff(RFC 6092)思路根据 JSON 的特点,可以将 JSON 分为 object, slice, value 三种类型,object 对应 "a":{}, slice 对应 [], value 类型对应 1, 如一个 JSON 如下:{ "a": [1]}就可以看作一个 object 类型的 a, 值为一个 slice 类型, slice 类型中又包含一个 value 类型,由此可以把一个 JSON 对象转换为一颗树,DFS 对比两颗树,就原创 2023-12-11 23:00:30 · 2443 阅读 · 0 评论 -
Golang 定时任务 github/robfig/cron/v3 使用与源码解析
Cron 源码阅读robfig/cron/v3 是一个 Golang 的定时任务库,支持 cron 表达式。Cron 的源码真实教科书级别的存在(可能是我菜 …),真的把低耦合高内聚体现地淋漓尽致,另外其中涉及的装饰器模式,并发处理等都很值得学习。使用 cron 可以很方便的实现一个定时任务,如下:go get github.com/robfig/cron/v3@v3.0.0package mainimport "github.com/robfig/cron/v3"c := cron.N原创 2021-02-18 21:23:08 · 23068 阅读 · 6 评论 -
【Go】sync.RWMutex源码分析
RWMutex读写锁相较于互斥锁有更低的粒度,它允许并发读,因此在读操作明显多于写操作的场景下能减少锁竞争的次数,提高程序效率。type RWMutex struct { w Mutex // held if there are pending writers writerSem uint32 // semaphore for writers to wait for completing readers readerSem uint32 // semaphore fo原创 2020-11-25 15:53:23 · 202 阅读 · 0 评论 -
【Go】sync.WaitGroup 源码分析
WaitGroupsync.WaitGroup 用于等待一组 goroutine 返回,如:var wg = sync.WaitGroup{}func do() { time.Sleep(time.Second) fmt.Println("done") wg.Done()}func main() { go do() go do() wg.Add(2) wg.Wait() fmt.Println("main done")}概览原创 2020-11-25 15:52:06 · 248 阅读 · 0 评论 -
【Golang 源码】sync.Map 源码详解
sync.Map不安全的 mapgo 中原生的 map 不是并发安全的,多个 goroutine 并发地去操作一个 map 会抛出一个 panicpackage mainimport "fmt"func main() { m := map[string]int { "1": 1, "2": 2, } // 并发写 for i := 0; i < 100; i ++ { go func(i int) { m原创 2020-11-11 16:51:45 · 398 阅读 · 0 评论 -
【Go 并发控制】上下文 context 源码
Context在 Go 服务中,往往由一个独立的 goroutine 去处理一次请求,但在这个 goroutine 中,可能会开启别的 goroutine 去执行一些具体的事务,如数据库,RPC 等,同时,这一组 goroutine 可能还需要共同访问一些特殊的值,如用户 token, 请求过期时间等,当一个请求超时后,我们希望与此请求有关的所有 goroutine 都能快速退出,以回收系统资源。context 包由谷歌开源,在 Go 1.7 时加入标准库,使用它可以很容易的把特定的值,取消信号, 截止原创 2020-11-01 17:49:07 · 198 阅读 · 0 评论