29__原子操作(上)

我们在前两篇文章中讨论了互斥锁、读写锁以及基于它们的条件变量,先来总结一下。

互斥锁是一个很有用的同步工具,它可以保证每一时刻进入临界区的 goroutine 只有一个。读写锁对共享资源的写操作和读操作则区别看待,并消除了读操作之间的互斥。

29__怎么给Canvas绘制加速?

你好,我是月影。

上节课,我们从宏观上了解了各个图形系统在性能方面的优劣,以及影响性能的要素。实际上,想要解决性能问题,我们就必须要知道真正消耗性能的点,从而结合项目需求进行有针对的处理,否则性能优化就是纸上谈兵、空中楼阁。

29__战术设计:如何像写故事一样找出模型?

你好,我是郑晔!

在上一讲中,我们讲了 DDD 中的战略设计,学习如何将识别出来的不同模型放到不同的限界上下文中。那么,接下来,我们就该做更具体的工作了,也就是如何设计模型。在 DDD 中,把具体的模型找出来的做法有一个更响亮的名字:战术设计。

29__自动化测试:如何把Bug杀死在摇篮里?

你好,我是宝玉。前不久我所在项目组完成了一个大项目,把一个网站前端的 jQuery 代码全部换成 React 代码,涉及改动的项目源代码文件有一百多个,变动的代码有几千行,最终上线后出乎意料的稳定,只有几个不算太严重的 Bug。

29__最容易失准的性能测试?你需要压测工具界的“悍马”wrk

你好,我是温铭。

在测试章节的最后一节课,我和你来聊聊性能测试。这部分内容并非 OpenResty 独有,对于其他的后端服务来说,都是一样适用的。

性能测试很常见,在我们交付产品的时候,都会带有性能指标的要求,比如 QPS、TPS 达到多少,延时要低于多少毫秒,可以并发支持多少用户的连接等等。对于开源项目而言,我们发版本之前也会做一次性能测试,和上一个版本对比,看是否有明显的衰退。也有一些中立的网站,会发布同类产品的性能对比数据。不得不说,性能测试离我们真的很近。

29_“懒惰”应该是所有程序员的骄傲

经过前面几个模块的学习,我们的专栏终于进入到程序员看上去最熟悉的一个主题:自动化。

每每提及自动化,我就会想起 Perl 语言的发明人 Larry Wall 一个经典叙述:优秀程序员应该有三大美德:懒惰、急躁和傲慢(Laziness, Impatience and hubris)。

29_24|条形饼状柱状图最适合用在什么场景下

24|条形、饼状、柱状图最适合用在什么场景下?

你好,我是尹会生。

提起图表,你一定会想到 Excel 和 PPT 中的条形图、饼状图、柱状图,这在我们进行工作汇报的时候会经常用到,是我们最经常打交道的图表了。除此之外,还有很多其他种类的图表,比如折线图、热力图等等。

29_26丨案例手把手带你理解TPS趋势分析

26丨案例:手把手带你理解TPS趋势分析

在性能分析中,前端的性能工具,我们只需要关注几条曲线就够了:TPS、响应时间和错误率。这是我经常强调的。

29_28丨EM聚类上如何将一份菜等分给两个人

28丨EM聚类(上):如何将一份菜等分给两个人?

今天我来带你学习 EM 聚类。EM 的英文是 Expectation Maximization,所以 EM 算法也叫最大期望算法。

我们先看一个简单的场景:假设你炒了一份菜,想要把它平均分到两个碟子里,该怎么分?

29_28丨从磁盘IO的角度理解SQL查询的成本

28丨从磁盘I/O的角度理解SQL查询的成本

在开始今天的内容前,我们先来回忆一下之前的内容。

数据库存储的基本单位是页,对于一棵 B+ 树的索引来说,是先从根节点找到叶子节点,也就是先查找数据行所在的页,再将页读入到内存中,在内存中对页的记录进行查找,从而得到想要数据。你看,虽然我们想要查找的,只是一行记录,但是对于磁盘 I/O 来说却需要加载一页的信息,因为页是最小的存储单位。