在 Go 汇编中存储指针的技巧与陷阱

本文探讨了如何在 Go 的汇编代码中安全地操作指针,避免与 Go 垃圾回收器冲突。由于 Go 的垃圾回收机制,直接在汇编中操作指针需要显式地通知垃圾回收器,这通常需要调用 `runtime.gcWriteBarrier2` 和 `runtime.writeBarrier` 函数。文章还介绍了如何分配 128 位对齐的内存,以利用 AVX 指令,并提供了一种巧妙的解决方法。但需要注意的是,直接操作底层运行时函数存在风险,未来版本可能不再支持。
阅读更多
本文探讨了如何在 Go 的汇编代码中安全地操作指针,避免与 Go 垃圾回收器冲突。由于 Go 的垃圾回收机制,直接在汇编中操作指针需要显式地通知垃圾回收器,这通常需要调用 `runtime.gcWriteBarrier2` 和 `runtime.writeBarrier` 函数。文章还介绍了如何分配 128 位对齐的内存,以利用 AVX 指令,并提供了一种巧妙的解决方法。但需要注意的是,直接操作底层运行时函数存在风险,未来版本可能不再支持。
阅读更多
本文通过逐步优化一个在Linux系统中读写管道的测试程序,探索了Unix管道的实现方式。作者从一个吞吐量约为3.5GiB/s的简单程序开始,利用Linux的perf工具进行性能分析,最终将性能提升了20倍以上。优化过程包括使用vmsplice和splice系统调用避免数据复制、使用巨页减少页面分配开销以及使用繁忙循环减少同步开销等。
阅读更多
本文介绍了Linux中使用io_uring进行多事件等待的机制。传统上,等待事件依赖于系统调用,例如read()、nanosleep()等,而epoll_wait可以用于等待多个文件描述符。然而,某些等待场景,例如futex(),无法通过文件描述符实现。io_uring提供了一种通用的异步框架,允许用户提交多个请求并等待任意一个完成,从而实现对包括futex在内的多种等待任务的多路复用。io_uring的优势在于减少了系统调用次数,避免了用户空间和内核空间之间的数据拷贝,并且支持futex等关键功能,方便构建高效的异步框架。
阅读更多
文章介绍了一种利用值预测来提高CPU缓存命中率的技术。文章首先解释了CPU分支预测和缓存的工作原理,然后通过一个链表求和的例子展示了L1缓存命中带来的数据依赖问题。作者提出了一种值预测的方法,通过预测下一个节点的地址来消除数据依赖,从而提高代码执行效率。最后,作者还提供了一些代码示例和测试结果,证明了该技术的有效性。
阅读更多