摸鱼精选第 7 期
1. C in ASM(ARM64)
C 程序设计语言的汇编解释系列文章,作者通过 Xcode 自带的 Clang,分析 C 语言生成的 ARM64 汇编指令,有点类似 CSAPP 里的 X86 指令。
了解一下这个对于移动端的优化和嵌入式的优化非常有帮助。
2. iOS 微信全文搜索技术优化
搜索引擎是FTS5 ,这是 SQLite 的全文搜索扩展模块,也有中文翻译。
微信的核心数据库是 wcdb ,基于 SQLite 二次开发优化:
- 实现 FTS5 的 Segment 自动 Merge 机制
- 分词器优化
- 索引内容支持多级分隔符
全文搜索应用逻辑优化也进行了以下优化:
-
数据库表格式优化
-
非文本搜索内容的保存方式
将非文本搜索内容直接和可搜索文本内容一起存储在 FTS 索引表中
-
避免冗余索引内容
FTS5 支持给索引表中的列添加 UNINDEXED 约束
-
降低索引内容的大小
把可搜索文本内容设置在第一列的话(多个可搜索文本列的话,把内容多的列放到第一列),就可以少保存列分割符 0x01 和列号,这样可以明显降低索引文件大小。
-
索引文件大小优化数据
-
-
索引更新逻辑优化
-
搜索逻辑优化
目前 iOS 微信已经将这套新全文搜索技术方案全量应用到聊天记录、联系人和收藏的搜索业务中。使用新方案之后,全文搜索的索引文件占用空间更小,索引更新耗时更少,搜索速度也更快了,可以说全文搜索的性能得到了全方位提升。
3. 2022 年,我们再来谈谈 React 状态管理
作者梳理了从 jQuery 时候的状态管理到现在的 hooks,然后提出了自己开发的简易状态管理工具resso
。
4. C++ Best Practices (C++最佳实践)翻译与阅读笔记
英文版原版下载
经评论区网友提醒,原作者的 C++ Weekly 系列也很不错,都是 Modern C++的内容。
5. Effective Modern C++
42 招独家技巧助您改善 C++11 和 C++14 的高效用法
非常值得一看,网上可以搜索到盗版的中文版,还有网友自己翻译的版本。
6. 《深入解析 Go》
本书为开源电子书,虽然最后更新是 在 2018 年,但是 Go 核心的东西这几年变化不大,值得一读。
点击可以在线阅读
7. 石墨文档 Websocket 百万长连接技术实践
在网页端做实时应用,只有 WebSocket 可选,其他的 MQTT.js、SocketIO.js 底层还是 WebSocket。石墨文档这种协同办公的场景更需要实时性和准确性,作者在这方面做了很多的努力,重构了网关服务。
-
对网关服务与业务服务的解耦,移除对 Nginx 的依赖,让整体架构更加清晰。
-
从用户建立连接到底层业务推送消息的整体流程分析,对其中这些流程进行了具体的优化。以下各个方面让 2.0 版本的网关有了更少的资源消耗,更低的单位用户内存损耗、更加完善的监控报警体系,让网关服务本身更加可靠:
-
可降级的握手流程;
-
Socket ID 生产;
-
客户端心跳处理过程的优化;
-
自定义 Headers 避免了消息解码,强化了链路追踪与监控;
-
消息的接收与发送代码结构设计上的优化;
-
对象资源池的使用,使用缓存降低 GC 频率;
-
消息体的序列化压缩;
-
接入服务观测基础设施,保证服务稳定性。
-
在保证网关服务性能过关的同时,更进一步的是收敛底层组件服务对网关业务调用的方式,从以前的 HTTP、Redis、Kafka 等方式,统一为 gRPC 调用,保证了来源可查可控,为后续业务接入打下了更好的基础。
8. Awesome SwiftUI
包含 SwiftUI 的教程,库, WWDC Sessions,文章,例子等。
9. 深入浅出现代 Web 编程
本公开课免费,主打全栈开发,主题从 Web 基础到 React 开发,接着 Node 和 Express 开发,然后使用 Redux、React Router 开发网页,GraphQL 开发数据库,Typescript,React Native 开发移动端,CI/CD 自动化测试开发,Docker 使用,PostgreSQL 关系数据库使用。
10. React Best Practices – Tips for Writing Better React Code in 2022
文章内容包括以下主题:
- 当前 React 开发者面临的三个挑战:可维护性,对 React 的深入理解,可扩展性
- 如何编译 Clean、Performant、Maintainable 的 React 组件
11. 24 days from node.js to Rust
本文目的是教你快速从 node.js 开发转到 Rust 开发上,node.js 能做的都可以用 Rust 对应实现。
本系列共 24 章节,已完结,有GitHub 仓库。
12. 用 125 行 C 语言编写一个简单的 16 位虚拟机
博文翻译自英文版
本文描述的是一个简单的进程虚拟机,旨在在独立于平台的环境中执行简单的计算机程序。该虚拟机基于 LC-3 计算机体系结构,能够解释和执行 LC3 汇编代码(的子集)。 该虚拟机实现了:中断处理、优先级、进程、状态寄存器 (PSR)、特权模式、主管堆栈、用户堆栈等最基本的硬件内容。
13. React Native 原理之跨端通信机制
RN 通信链路中的主要模块包括:
- 给 JS 代码调用的 NativeModule,作为调用入口,JS 代码调用它暴露出来的方法传入调用参数并开始调用流程,但是该模块不解析协议和参数,可以称作 RNRPCNativeModule;
- 在 Native 模块处理完后,RNRPCNativeModule 使用 RCTDeviceEventEmitter 生成一个事件回调给 JS 代码,并带上执行结果。
14. Flutter 布局指南之深入理解 BoxConstraints
一般来说,有三种类型的约束。Tight、Loose 的和 Unbounded 约束。
屏幕将 Tight 约束传递给根 Widget,使其与设备屏幕一样大。然后再往后,每个父 Widget 都会向其子 Widget 传递约束。
布局 Widget 有它们自己的特定行为:
- 当把约束传递给子代时,父代可以把 Tight 约束改为 Loose 约束,或者不加改变地传递。 Widget 的尺寸在不同的条件下可能是不同的。这取决于各种因素,如它的子尺寸、它的父尺寸、它自己的约束、父约束等。
- 一般来说,一个 Widget 会尽可能的大,或者尽可能的小,或者一个特定的尺寸。
- 使用 BoxConstraints 构造函数设置约束。
- 我们也可以使用一些 Box Widget 来覆盖父级约束,如 UnconstrainedBox, SizedBox, ConstrainedBox 等。 父约束和子约束中存在的无约束约束会导致渲染错误。Flutter 不能渲染无限大的尺寸。
15. go 没有 volatile 关键字
Java 中的 volatile 关键字用于提供可见性以及有序性两个语义。 Go 中没有 Java 的 volatile 关键字,这是因为 volatile 服务于共享内存,而 Go 的设计者推崇 Do not communicate by sharing memory; instead, share memory by communicating。换言之,如果没有共享内存,只有通信,那么就不需要 volatile 关键字了。
补充一下:
C/C++ 的 volatile 大多用于开发嵌入式系统或设备驱动时读写内存映射的硬件设备,设备的寄存器值可能随时都会变,使用 volatile 可以确保访问不会被编译器优化掉。
16. Redis 多线程演进
Redis 4.0 引入 Lazy Free 线程,解决了诸如大键删除导致服务器阻塞问题,在 6.0 版本引入了 I/O Thread 线程,正式实现了多线程,但相较于 Tair,并不太优雅,而且性能提升上并不多,压测看,多线程版本性能是单线程版本的 2 倍,Tair 多线程版本则是单线程版本的 3 倍。在作者看来,Redis 多线程无非两种思路,I/O threading 和 Slow commands threading Redis 作者更倾向于采用集群方式来解决 I/O threading,尤其是在 6.0 版本发布的原生 Redis Cluster Proxy 背景下,使得集群更加易用。此外,作者更倾向于 slow operations threading(比如 4.0 版本发布的 Lazy Free)来解决多线程问题。后续版本,是否会将 IO Thread 实现的更加完善,采用 Module 实现对慢操作的优化,着实值得期待。
17. Better performance with canvas in SwiftUI
作者用包含 50 多个同样 Card View 的 ScrollView 来测试 SwiftUI 的 canvas 性能,对比内存占用和 CPU 使用率,发现居然比在 View 里直接布局视图更好,如果图片是动态的,使用 Canvas 重绘会有更好的收益。