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