
祝大家龙年大吉!
runtime.Pinner 是 Go 1.21.0 中引入的一个类型。
Pinner
是一组固定的 Go 对象。可以使用 Pin
方法来固定一个对象。Pinner
固定的所有对象都可以使用 Unpin
方法解开固定。
SourceGraph 的工程师 Camden Cheek 提供的一个利用SIMD进行Go性能优化的故事:From slow to SIMD: A Go optimization story。
Go 1.22中可以 range 一个整数,比如下面的代码:
|
|
这个大家都已经知道了,其实对应的提案中还有一个隐藏的功能,就是可以 range 一个函数,比如下面的代码(摘自官方代码库internal/trace/v2/event.go):
|
|
就少有介绍了。
本文尝试介绍它,让读者先了解一下,它在Go 1.22 中是一个实验性的功能,还不确定未来在哪个版本中会被正式支持。
官方wiki中也有一篇介绍: Rangefunc Experiment,类似问答的形式,也是必读的知识库。
除了通常的新有线/无线网络硬件支持和大型 Linux 网络子系统中的其他例行变动之外,Linux 6.8 内核还对核心网络代码进行了一些关键改进,当遇到许多并发网络连接时,TCP 性能可以提高 ~40%。
双缓冲(double buffering)是高效处理I/O操作的一种并发技术,它使用两个buffer,一个goroutine使用其中一个buffer进行写,而另一个goroutine使用另一个buffer进行读,然后进行交换。这样两个goroutine可能并发的执行,减少它们之间的等待和阻塞。
本文还提供了一个类似Java的java.util.concurrent.Exchanger的Go并发原语,它可以用来在两个goroutine之间交换数据,快速实现双缓冲的模式。 这个并发原语可以在github.com/smallnest/exp/sync/Exchanger找到。
如果我们将Go语言的并发原语弄的滚瓜烂熟,那么我们使用组合的方式,创造出更高级的并发原语,针对一些特定的并发场景,可以提供更高效的并发原语。
这篇文章就是就是利用atomic中的并发原语和条件变量,组合出类似C++ 20规范中atomic类型的wait/notify_one/notify_all的功能。