Skip to content
Calvin's Blog

摸鱼精选第 7 期

Mar 15, 2022 — Reading

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 二次开发优化:

全文搜索应用逻辑优化也进行了以下优化:

目前 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。石墨文档这种协同办公的场景更需要实时性和准确性,作者在这方面做了很多的努力,重构了网关服务。

在保证网关服务性能过关的同时,更进一步的是收敛底层组件服务对网关业务调用的方式,从以前的 HTTP、Redis、Kafka 等方式,统一为 gRPC 调用,保证了来源可查可控,为后续业务接入打下了更好的基础。

包含 SwiftUI 的教程,库, WWDC Sessions,文章,例子等。

本公开课免费,主打全栈开发,主题从 Web 基础到 React 开发,接着 Node 和 Express 开发,然后使用 Redux、React Router 开发网页,GraphQL 开发数据库,Typescript,React Native 开发移动端,CI/CD 自动化测试开发,Docker 使用,PostgreSQL 关系数据库使用。

文章内容包括以下主题:

本文目的是教你快速从 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 有它们自己的特定行为:

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 重绘会有更好的收益。