念头。遇见不同想法 NIANTOU.NET

在别人的文字里,遇见自己的念头。

独立书写 · 自由阅读

Joway · Random Thoughts

按发表时间排列
40 篇

Golang for-range 内部实现

最近在写一个编解码的功能时发现使用 Golang for-range 会存在很大的性能问题。 假设我们现在有一个 Data 类型表示一个数据包,我们从网络中获取到了 [1024]Data 个数据包,此时我们需要对其进行遍历操作。一般我们会使用 for-i++ 或者 for-range 两种方式遍历,如下代码: type Data [256]byte func BenchmarkForStruct(b *testing.B) { var items [1024]Data var result Data for i :

Golang Interface 内部实现

最近遇到一个由于 Golang Interface 底层实现,引发的线上 panic 问题,虽然根源在于赋值操作没有保护起来,却意外地发现了关于 interface 的一些有意思的底层细节。 假设我们现在有以下定义: type Interface interface { Run() } type Implement struct { n int } func (i *Implement) Run() { fmt.Printf(i.n) } 对于使用者而言,一个变量无论是 Interface 类型或是 *Implem

真理的有限性

机器世界与真实世界的差异在于,机器世界的法律是约定能够做什么,而真实世界的法律是约定不能够做什么。编程是在一个有限中变化出无限,而生活是在无限中寻找到自己的有限。机器世界本身就是真实世界中的一个小小的有限。 人们总试图从一个无限的世界里去发寻规律,以其获得一条在有限领域能够稳定可靠的真理。无论是科学甚至玄学,概莫如是。

Golang rand 库锁竞争优化

背景 最近在实现一个随机负载均衡器的时候发现一个问题,在高并发的情况下,官方标准库 rand.Intn() 性能会急剧下降。翻了下实现以后才发现它内部居然是全局共享了同一个 globalRand 对象。 一段测试代码: func BenchmarkGlobalRand(b *testing.B) { b.RunParallel(func(pb *testing.PB) { for pb.Next() { rand.Intn(100) } }) } func BenchmarkCustomRand(b *testin

Meaningless or Meaningful

边走边想 小时候在百度知道里提过一个问题,「人活着的意义是什么」。靠这个问题赚了一些百度积分,可并没能消除我当时的困惑。长大后在王兴的一个访谈里,看到他在大学同乡迎新会的时候问了学长们一样的问题,当时他姐刚好也在,为了打破尴尬不得不模糊地回答了一句: “这个问题,要边走边想。” Nothing But Yourself 在播客《阿米小酒馆 - 【op.23】两个写作者的困顿与坚定》 中听到复旦民间校训「自由而无用」的英文翻译原来是「nothing but yourself」,瞬间被这句话击中。

分布式文件系统的演化

文件系统是操作系统 IO 栈里非常重要的一个中间层,其存在的意义是为了让上层应用程序有一层更加符合人类直觉的抽象来进行文档的读写,而无需考虑底层存储上的细节。 本地文件系统 在讨论分布式文件系统前,我们先来回顾下本地文件系统的组成。 存储结构 在前面一张图里,我们能够看到文件系统直接和通用块层进行交互,无论底层存储介质是磁盘还是 SSD,都被该层抽象为 Block 的概念。文件系统在初始化时,会先在挂载的块存储上的第一个位置创建一个 Super Block:

从动物森友会聊主机游戏联机机制

最近在玩动物森友会的时候时常会遇到一些迷之联机问题,在网上一番搜索,发现大家的答案都趋于用玄学来解释,于是便有了兴致想在原理上搞懂这些问题产生的根源以及动森这款游戏的一些联机设定背后的技术原因。 事先声明,本人并不从事游戏行业亦非主机游戏长期玩家,如有纰漏或其他角度的补充,欢迎在评论区告知。

创业公司的文化

前段时间有一个小事情让我想到创业公司文化这件事情。 我目前就职在一家创业公司,我们有一个文化是有相当一部分同事会有一个「艺名」。艺名的产生有很多种场景。一种类似古代的「字」,是自己为摆脱原始名字的依赖,为自己取的代称,有着很强个人色彩,比如我的 Joway。还有一种是在公司发展过程中自然而然形成的「外号」,比如中国公司常见的X哥,通常还带着点共同记忆在里面。

伊朗见闻录

10月份的时候在伊朗自南向北,进行了为期 9 天的旅行。 之所以会想去伊朗,是因为在 2019 年发生了太多事情让我疲于不断修正自己的价值观,以至于我连基本的「明是非」能力也丧失殆尽。如同数学公式推导一样,我需要有一些基本的「公理」,以此来构建价值观的「定理」。而越是试图去理解这个世界,越是会发现似乎这个世界是不存在一个「普世」的「公理」。

NodeJS 内存泄漏检测与定位

最近解决了一个 Node.JS 应用内存泄漏 Bug,顺便学会了用 Chrome DevTools 去看 heapdump 文件。这里做一些简单的记录。 如何「优雅地」获得 heapdump 文件 由于我们所有应用都是以容器部署的,所以要去获得某个容器内的文件,并拷贝到本地难度还是比较大,也非常麻烦。考虑到调试时或许会需要下载非常多次的 snapshot 文件,建议可以包下 heapdump 库,做成一个接口,把文件 dump 之后再传输给客户端,这样一劳永逸。

读到这里,留一点时间给自己的念头。