<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>优化与验证 on Dorkytiger 的小屋</title>
    <link>https://www.dorkytiger.top/kotlin/kotlin-benchmark/07-optimization-and-validation/</link>
    <description>Recent content in 优化与验证 on Dorkytiger 的小屋</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <atom:link href="https://www.dorkytiger.top/kotlin/kotlin-benchmark/07-optimization-and-validation/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>优先级金字塔：先问要不要做</title>
      <link>https://www.dorkytiger.top/kotlin/kotlin-benchmark/07-optimization-and-validation/01-priority-pyramid/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.dorkytiger.top/kotlin/kotlin-benchmark/07-optimization-and-validation/01-priority-pyramid/</guid>
      <description>&lt;h1 id=&#34;71-优先级金字塔先问要不要做&#34;&gt;7.1 优先级金字塔：先问要不要做&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;上一节：无　|　下一节：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/07-optimization-and-validation/02-reduce-work/&#34;&gt;7.2 减少工作&lt;/a&gt;
配套代码：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/code/07-optimization-and-validation/01-priority-pyramid/&#34;&gt;07-optimization-and-validation/01-priority-pyramid&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一句话结论&#34;&gt;一句话结论&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;优化的收益从「不做」到「调 JVM 参数」递减，而成本和风险递增。&lt;/strong&gt; 把顺序做反了，你会花一周调 GC 参数去优化一个本该加索引的查询。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一用医院分诊理解优先级&#34;&gt;一、用「医院分诊」理解优先级&lt;/h2&gt;
&lt;p&gt;急诊室不会按「谁先来」看病，而是按&lt;strong&gt;紧急程度&lt;/strong&gt;分诊：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;优先级&lt;/th&gt;
					&lt;th&gt;情况&lt;/th&gt;
					&lt;th&gt;处理&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;心跳骤停&lt;/td&gt;
					&lt;td&gt;立刻抢救&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;2&lt;/td&gt;
					&lt;td&gt;大出血&lt;/td&gt;
					&lt;td&gt;尽快处理&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;3&lt;/td&gt;
					&lt;td&gt;骨折&lt;/td&gt;
					&lt;td&gt;排队等&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;4&lt;/td&gt;
					&lt;td&gt;擦伤&lt;/td&gt;
					&lt;td&gt;最后处理&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;如果先给擦伤的人包扎，心跳骤停的人就死了。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;性能优化完全一样。&lt;strong&gt;「不做某个功能」的收益常常大于「把它优化得快一点」&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;二六级金字塔&#34;&gt;二、六级金字塔&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;⑥ JVM 参数调优          ← 收益最小、风险最高、最容易做错
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;⑤ 微观常数优化（减少分配、避免装箱、换序列化器）
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;④ 缓存与池化
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;③ 架构与并发（批量、异步、隔离、背压）
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;② 算法与数据访问（复杂度、IO 次数、N+1、缺索引）
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;① 先问「这个功能真的需要吗」  ← 收益最高、成本最低
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;每一级的说明与典型收益&#34;&gt;每一级的说明与典型收益&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;级别&lt;/th&gt;
					&lt;th&gt;做什么&lt;/th&gt;
					&lt;th&gt;典型收益&lt;/th&gt;
					&lt;th&gt;成本/风险&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;① 不必要&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;砍掉不必要的功能、减少返回字段、去掉重复计算&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;极大&lt;/strong&gt;（直接省掉）&lt;/td&gt;
					&lt;td&gt;低（但是产品决策）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;② 算法与数据访问&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;加索引、消除 N+1、批量查询、改进算法&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;数倍&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;低–中（改 SQL/代码）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;③ 架构与并发&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;批量、异步化、隔离资源池、加背压&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;数倍&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;中（改架构）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;④ 缓存与池化&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;多级缓存、连接池调优&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;中&lt;/strong&gt;（P50 明显，P99 未必）&lt;/td&gt;
					&lt;td&gt;中–高（一致性风险）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;⑤ 微观常数&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;减少分配、避免装箱、换序列化器&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;个位数百分比&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;中（可读性下降）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;⑥ JVM 参数&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;堆大小、GC 选型&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;个位数百分比&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;高（需长期验证）&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;关键观察&lt;/strong&gt;：&lt;strong&gt;①–③ 的收益是数倍级，⑤–⑥ 是个位数百分比级。&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>减少工作：最可靠的一类优化</title>
      <link>https://www.dorkytiger.top/kotlin/kotlin-benchmark/07-optimization-and-validation/02-reduce-work/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.dorkytiger.top/kotlin/kotlin-benchmark/07-optimization-and-validation/02-reduce-work/</guid>
      <description>&lt;h1 id=&#34;72-减少工作最可靠的一类优化&#34;&gt;7.2 减少工作：最可靠的一类优化&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;上一节：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/07-optimization-and-validation/01-priority-pyramid/&#34;&gt;7.1 优先级金字塔&lt;/a&gt;　|　下一节：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/07-optimization-and-validation/03-concurrency-and-parallelism/&#34;&gt;7.3 并发与并行&lt;/a&gt;
配套代码：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/code/07-optimization-and-validation/02-reduce-work/&#34;&gt;07-optimization-and-validation/02-reduce-work&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一句话结论&#34;&gt;一句话结论&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;与其把一件事做得更快，不如不做它。&lt;/strong&gt; 「减少工作」类的优化（批处理、消除 N+1、提前剪枝、避免重复序列化）&lt;strong&gt;收益最确定、副作用最小、几乎不需要权衡&lt;/strong&gt;——因为没有引入新的组件、缓存或并发。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一用少跑腿理解减少工作&#34;&gt;一、用「少跑腿」理解减少工作&lt;/h2&gt;
&lt;p&gt;你每天要跑 5 趟超市，每趟 20 分钟，共 100 分钟。&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;优化方向&lt;/th&gt;
					&lt;th&gt;做法&lt;/th&gt;
					&lt;th&gt;效果&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;提高速度&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;开车更快（危险）&lt;/td&gt;
					&lt;td&gt;100 → 80 分钟&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;减少工作&lt;/strong&gt; ⭐&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;一次买齐&lt;/strong&gt;（列清单）&lt;/td&gt;
					&lt;td&gt;100 → 24 分钟&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;后者的收益是前者的 8 倍，而且没有风险。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;后端完全一样&lt;/strong&gt;：把 N 次查询合并成 1 次，比「把每次查询优化得快 20%」收益大得多。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;二五种减少工作的模式&#34;&gt;二、五种「减少工作」的模式&lt;/h2&gt;
&lt;h3 id=&#34;-批处理n-次变-1-次&#34;&gt;❶ 批处理：N 次变 1 次&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-kotlin&#34; data-lang=&#34;kotlin&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// ❌ N 次往返
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;val&lt;/span&gt; orders = ids.map { repo.findById(&lt;span style=&#34;color:#66d9ef&#34;&gt;it&lt;/span&gt;) }        &lt;span style=&#34;color:#75715e&#34;&gt;// 100 次查询
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// ✅ 1 次往返
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;val&lt;/span&gt; orders = repo.findByIds(ids)                  &lt;span style=&#34;color:#75715e&#34;&gt;// 1 次：where id = any(?)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;典型收益&lt;/strong&gt;：组件基准实测（第 3 章 3.2 节）——&lt;strong&gt;批量比循环快 82 倍&lt;/strong&gt;（P99 从 210 ms 降到 6.2 ms）。&lt;/p&gt;</description>
    </item>
    <item>
      <title>并发与并行：加资源不等于变快</title>
      <link>https://www.dorkytiger.top/kotlin/kotlin-benchmark/07-optimization-and-validation/03-concurrency-and-parallelism/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.dorkytiger.top/kotlin/kotlin-benchmark/07-optimization-and-validation/03-concurrency-and-parallelism/</guid>
      <description>&lt;h1 id=&#34;73-并发与并行加资源不等于变快&#34;&gt;7.3 并发与并行：加资源不等于变快&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;上一节：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/07-optimization-and-validation/02-reduce-work/&#34;&gt;7.2 减少工作&lt;/a&gt;　|　下一节：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/07-optimization-and-validation/04-caching/&#34;&gt;7.4 缓存&lt;/a&gt;
配套代码：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/code/07-optimization-and-validation/03-concurrency-and-parallelism/&#34;&gt;07-optimization-and-validation/03-concurrency-and-parallelism&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一句话结论&#34;&gt;一句话结论&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;并行化的收益有上限，而且过了某个点就变成负的。&lt;/strong&gt; 原因是：并行需要共享资源（CPU、数据库、下游），而&lt;strong&gt;共享资源会排队&lt;/strong&gt;。所以「加线程/协程」不是免费的加速——它常常只是把瓶颈从应用层转移到下游。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一用超市收银台理解并行的上限&#34;&gt;一、用「超市收银台」理解并行的上限&lt;/h2&gt;
&lt;p&gt;超市有 8 个收银台（= CPU 核数）。顾客排队结账。&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;做法&lt;/th&gt;
					&lt;th&gt;结果&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;开 4 个台&lt;/td&gt;
					&lt;td&gt;队伍较长&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;开 8 个台&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;最优&lt;/strong&gt;（与核数匹配）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;开 16 个台&lt;/td&gt;
					&lt;td&gt;收银员互相挤，通道拥堵 → &lt;strong&gt;反而更慢&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;开 100 个台&lt;/td&gt;
					&lt;td&gt;完全没有空间，无法工作&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;关键洞察&lt;/strong&gt;：&lt;strong&gt;收银员多了，但超市的物理空间、仓库补货能力没变&lt;/strong&gt;——瓶颈转移了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;后端完全一样&lt;/strong&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;加了 2 倍线程 → 应用能并发处理 2 倍请求
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;但数据库只有那么多连接和处理能力
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;→ 请求全部堵在数据库前面
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;→ 整体更慢（因为锁竞争 + 上下文切换 + 数据库过载）
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;二并行的三种正确用法&#34;&gt;二、并行的三种正确用法&lt;/h2&gt;
&lt;h3 id=&#34;-对-io-密集操作用协程但要限制并发&#34;&gt;❶ 对 IO 密集操作：用协程，但要限制并发&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-kotlin&#34; data-lang=&#34;kotlin&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// ❌ 无限制：10 万个协程全打到下游
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;suspend&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;fun&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;fetchAll&lt;/span&gt;(ids: List&amp;lt;Long&amp;gt;) = coroutineScope {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ids.map { async { httpGet(&lt;span style=&#34;color:#66d9ef&#34;&gt;it&lt;/span&gt;) } }.awaitAll()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// ✅ 限制并发（保护下游，也保护自己）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;val&lt;/span&gt; limiter = Semaphore(&lt;span style=&#34;color:#ae81ff&#34;&gt;64&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;suspend&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;fun&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;fetchAll&lt;/span&gt;(ids: List&amp;lt;Long&amp;gt;) = coroutineScope {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ids.map { id &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; async { limiter.withPermit { httpGet(id) } } }.awaitAll()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// ✅ 或按批次（更可控）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;suspend&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;fun&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;fetchAllBatched&lt;/span&gt;(ids: List&amp;lt;Long&amp;gt;, batch: Int = &lt;span style=&#34;color:#ae81ff&#34;&gt;64&lt;/span&gt;) =
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ids.chunked(batch).flatMap { chunk &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        coroutineScope { chunk.map { async { httpGet(&lt;span style=&#34;color:#66d9ef&#34;&gt;it&lt;/span&gt;) } }.awaitAll() }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;为什么要限制&lt;/strong&gt;：&lt;strong&gt;你是下游的客户端，你的并发就是下游的负载。&lt;/strong&gt; 无限制的并发 = 对下游的 DDoS。&lt;/p&gt;</description>
    </item>
    <item>
      <title>缓存：三重防护与三重代价</title>
      <link>https://www.dorkytiger.top/kotlin/kotlin-benchmark/07-optimization-and-validation/04-caching/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.dorkytiger.top/kotlin/kotlin-benchmark/07-optimization-and-validation/04-caching/</guid>
      <description>&lt;h1 id=&#34;74-缓存三重防护与三重代价&#34;&gt;7.4 缓存：三重防护与三重代价&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;上一节：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/07-optimization-and-validation/03-concurrency-and-parallelism/&#34;&gt;7.3 并发与并行&lt;/a&gt;　|　下一节：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/07-optimization-and-validation/05-backpressure-and-resilience/&#34;&gt;7.5 背压与韧性&lt;/a&gt;
配套代码：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/code/07-optimization-and-validation/04-caching/&#34;&gt;07-optimization-and-validation/04-caching&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一句话结论&#34;&gt;一句话结论&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;缓存是&amp;quot;用一致性和复杂度换延迟&amp;quot;的交易&lt;/strong&gt;，不是免费的加速。而且它有个反直觉的性质：&lt;strong&gt;能改善 P50，却可能让 P99 变差&lt;/strong&gt;（因为未命中的那部分请求变慢了）。所以缓存必须&lt;strong&gt;有防护、有指标、有代价评估&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一用把工具放手边理解缓存&#34;&gt;一、用「把工具放手边」理解缓存&lt;/h2&gt;
&lt;p&gt;你在修车，工具都在 20 米外的工具间。两种做法：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;做法&lt;/th&gt;
					&lt;th&gt;好处&lt;/th&gt;
					&lt;th&gt;代价&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;每次去工具间拿&lt;/td&gt;
					&lt;td&gt;永远是&amp;quot;最新最全&amp;quot;的&lt;/td&gt;
					&lt;td&gt;慢&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;把常用工具放手边&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;快&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;工具会占地方；可能不是最新的；要找地方放&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;缓存完全一样&lt;/strong&gt;：快，但要占内存、可能过期（数据不一致）、需要管理（失效逻辑）。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;二三个收益&#34;&gt;二、三个收益&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;收益&lt;/th&gt;
					&lt;th&gt;说明&lt;/th&gt;
					&lt;th&gt;典型量级&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;降低延迟&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;内存读取（纳秒）vs 数据库查询（毫秒）&lt;/td&gt;
					&lt;td&gt;10–1000 倍（单次）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;提高吞吐&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;同样硬件能扛更多请求&lt;/td&gt;
					&lt;td&gt;取决于命中率&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;保护下游&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;减少打到数据库的请求&lt;/td&gt;
					&lt;td&gt;按命中率折算&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;注意第一项&lt;/strong&gt;：单次缓存的收益是巨大的（纳秒 vs 毫秒），但&lt;strong&gt;整体收益取决于命中率&lt;/strong&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;命中率 90% → 90% 的请求快 100 倍，10% 的请求慢一点（缓存开销）
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;命中率 50% → 一半快，一半慢——P99 可能变差
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;命中率 10% → 几乎没有收益，但引入了全部复杂度
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;三三个代价必须评估&#34;&gt;三、三个代价（必须评估）&lt;/h2&gt;
&lt;h3 id=&#34;-一致性风险--最危险&#34;&gt;❶ 一致性风险 🔴 最危险&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;场景&lt;/th&gt;
					&lt;th&gt;后果&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;缓存更新失败但数据库成功&lt;/td&gt;
					&lt;td&gt;用户看到旧数据，且不知道会持续多久&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;多实例缓存不一致&lt;/td&gt;
					&lt;td&gt;用户刷新两次看到不同结果&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;缓存过期与写入竞争&lt;/td&gt;
					&lt;td&gt;旧值覆盖新值（经典的缓存并发问题）&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;必须回答的问题&lt;/strong&gt;：&lt;/p&gt;</description>
    </item>
    <item>
      <title>背压与韧性：保护自己也保护下游</title>
      <link>https://www.dorkytiger.top/kotlin/kotlin-benchmark/07-optimization-and-validation/05-backpressure-and-resilience/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.dorkytiger.top/kotlin/kotlin-benchmark/07-optimization-and-validation/05-backpressure-and-resilience/</guid>
      <description>&lt;h1 id=&#34;75-背压与韧性保护自己也保护下游&#34;&gt;7.5 背压与韧性：保护自己也保护下游&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;上一节：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/07-optimization-and-validation/04-caching/&#34;&gt;7.4 缓存&lt;/a&gt;　|　下一节：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/07-optimization-and-validation/06-pooling/&#34;&gt;7.6 池化与复用&lt;/a&gt;
配套代码：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/code/07-optimization-and-validation/05-backpressure-and-resilience/&#34;&gt;07-optimization-and-validation/05-backpressure-and-resilience&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一句话结论&#34;&gt;一句话结论&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;这五种手段（限流、熔断、隔板、超时、重试）共同回答一个问题：当压力超过承载能力时，系统该&amp;quot;怎么坏&amp;quot;。&lt;/strong&gt; 好的设计是&lt;strong&gt;快速失败、局部失败、可恢复&lt;/strong&gt;；坏的设计是&lt;strong&gt;排队到崩、全局崩、需要重启&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一用水库理解背压&#34;&gt;一、用「水库」理解背压&lt;/h2&gt;
&lt;p&gt;一座水库遇到暴雨（流量激增）：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;措施&lt;/th&gt;
					&lt;th&gt;作用&lt;/th&gt;
					&lt;th&gt;对应&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;溢洪道&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;超过容量就放掉多余的水&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;限流&lt;/strong&gt;（拒绝多余请求）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;水位警戒线&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;到线就开闸，不等到决堤&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;熔断&lt;/strong&gt;（提前失败）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;分区堤坝&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;一个区决堤不影响其他区&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;隔板&lt;/strong&gt;（资源隔离）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;泄洪时间&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;给下游留出消化时间&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;超时&lt;/strong&gt;（及时放弃）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;重试&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;放掉的水再试一次&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;重试&lt;/strong&gt;（要有退避和上限）&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;关键洞察&lt;/strong&gt;：水库&lt;strong&gt;不会等到决堤才行动&lt;/strong&gt;——它在警戒水位就开始泄洪。&lt;strong&gt;这就是&amp;quot;提前失败&amp;quot;的价值。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;二五种手段的分工&#34;&gt;二、五种手段的分工&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;手段&lt;/th&gt;
					&lt;th&gt;防什么&lt;/th&gt;
					&lt;th&gt;关键参数&lt;/th&gt;
					&lt;th&gt;失败时的行为&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;限流&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;自己被打垮&lt;/td&gt;
					&lt;td&gt;速率上限&lt;/td&gt;
					&lt;td&gt;快速返回 429/503&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;熔断&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;被下游拖垮&lt;/td&gt;
					&lt;td&gt;错误率阈值 + 半开探测&lt;/td&gt;
					&lt;td&gt;快速失败（不调用下游）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;隔板&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;一个依赖拖垮全部&lt;/td&gt;
					&lt;td&gt;每个依赖的独立资源池&lt;/td&gt;
					&lt;td&gt;该依赖的请求排队，其他正常&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;超时&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;资源被长期占用&lt;/td&gt;
					&lt;td&gt;逐层递减的超时&lt;/td&gt;
					&lt;td&gt;主动放弃并释放资源&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;重试&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;偶发失败&lt;/td&gt;
					&lt;td&gt;次数上限 + 退避 + 抖动&lt;/td&gt;
					&lt;td&gt;放大压力（&lt;strong&gt;必须约束&lt;/strong&gt;）&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;注意最后一行&lt;/strong&gt;：&lt;strong&gt;重试是唯一一个会&amp;quot;放大压力&amp;quot;的手段&lt;/strong&gt;——所以它必须有严格约束。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;三超时预算最重要也最容易做错&#34;&gt;三、超时预算（最重要，也最容易做错）&lt;/h2&gt;
&lt;h3 id=&#34;核心规则&#34;&gt;核心规则&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;本层的超时 &amp;lt; 上游给你的超时
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;且逐层递减
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;客户端 500ms
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  └→ 网关 400ms
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       └→ 应用 300ms
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            ├→ 数据库 80ms
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            ├→ 缓存 10ms
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            └→ 下游服务 100ms
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;为什么这是最救命的一条&#34;&gt;为什么这是&amp;quot;最救命&amp;quot;的一条&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;❌ 错误配置：应用给数据库的超时是 30 秒（默认值，没人改）
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;① 数据库变慢，每个查询要 3 秒
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;② 应用线程被占住 3 秒（因为超时是 30 秒，不会提前放弃）
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;③ 网关在 1 秒时超时返回 504 给用户
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;④ 但应用线程还在等数据库（还有 2 秒）
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;⑤ 新请求继续进来，占用新线程 → 线程池耗尽
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;⑥ 所有接口开始超时 → 服务雪崩
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;⑦ 流量回落后，那些连接还在等 → 【无法自愈】
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;超时不是「容忍时间」，而是「放弃的时机」&lt;/strong&gt;——&lt;strong&gt;放弃得早，系统才能自愈&lt;/strong&gt;（第 3 章 3.6 节）。&lt;/p&gt;</description>
    </item>
    <item>
      <title>池化与复用：连接池要算，对象池要慎</title>
      <link>https://www.dorkytiger.top/kotlin/kotlin-benchmark/07-optimization-and-validation/06-pooling/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.dorkytiger.top/kotlin/kotlin-benchmark/07-optimization-and-validation/06-pooling/</guid>
      <description>&lt;h1 id=&#34;76-池化与复用连接池要算对象池要慎&#34;&gt;7.6 池化与复用：连接池要算，对象池要慎&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;上一节：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/07-optimization-and-validation/05-backpressure-and-resilience/&#34;&gt;7.5 背压与韧性&lt;/a&gt;　|　下一节：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/07-optimization-and-validation/07-jvm-tuning/&#34;&gt;7.7 JVM 调优&lt;/a&gt;
配套代码：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/code/07-optimization-and-validation/06-pooling/&#34;&gt;07-optimization-and-validation/06-pooling&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一句话结论&#34;&gt;一句话结论&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;池化是在「复用成本」与「获取成本」之间做取舍。&lt;/strong&gt; 对&lt;strong&gt;真正昂贵的资源&lt;/strong&gt;（数据库连接、线程）池化收益巨大；对&lt;strong&gt;本身就很便宜的&lt;/strong&gt;（普通对象），池化在 JVM 上通常是&lt;strong&gt;负优化&lt;/strong&gt;——因为池的同步成本可能超过分配成本。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一用租车-vs-买车理解池化&#34;&gt;一、用「租车 vs 买车」理解池化&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;做法&lt;/th&gt;
					&lt;th&gt;获取成本&lt;/th&gt;
					&lt;th&gt;持有成本&lt;/th&gt;
					&lt;th&gt;适用&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;每次买车&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;极高（几十万）&lt;/td&gt;
					&lt;td&gt;—&lt;/td&gt;
					&lt;td&gt;❌ 不现实&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;租车（池化）&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;低（走过去开走）&lt;/td&gt;
					&lt;td&gt;租金 + 停车位&lt;/td&gt;
					&lt;td&gt;✅ 偶尔用车&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;自己组装再拆开&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;组装费 &amp;gt; 直接买&lt;/td&gt;
					&lt;td&gt;—&lt;/td&gt;
					&lt;td&gt;❌ 荒谬&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;后端对应&lt;/strong&gt;：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;资源&lt;/th&gt;
					&lt;th&gt;获取成本&lt;/th&gt;
					&lt;th&gt;池化&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;数据库连接&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;高&lt;/strong&gt;（TCP 握手 + 认证 + 数据库侧分配进程/内存）&lt;/td&gt;
					&lt;td&gt;✅ 必须池化&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;线程&lt;/td&gt;
					&lt;td&gt;高（几十微秒 + 1MB 栈）&lt;/td&gt;
					&lt;td&gt;✅ 必须池化&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;HTTP 连接&lt;/td&gt;
					&lt;td&gt;中（TCP + TLS 握手）&lt;/td&gt;
					&lt;td&gt;✅ 应该复用&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;普通对象&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;极低&lt;/strong&gt;（TLAB 指针碰撞，比一次内存访问还快）&lt;/td&gt;
					&lt;td&gt;❌ &lt;strong&gt;通常是负优化&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;大缓冲（ByteArray）&lt;/td&gt;
					&lt;td&gt;中（分配 + GC + 可能 Humongous）&lt;/td&gt;
					&lt;td&gt;⚠️ 可能值得&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;直接内存缓冲&lt;/td&gt;
					&lt;td&gt;高&lt;/td&gt;
					&lt;td&gt;✅ 值得&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;注意第四行&lt;/strong&gt;：&lt;strong&gt;这是 JVM 与 C++ 最大的直觉差异之一&lt;/strong&gt;（第 6.7 节）。&lt;/p&gt;</description>
    </item>
    <item>
      <title>JVM 调优：永远排在最后</title>
      <link>https://www.dorkytiger.top/kotlin/kotlin-benchmark/07-optimization-and-validation/07-jvm-tuning/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.dorkytiger.top/kotlin/kotlin-benchmark/07-optimization-and-validation/07-jvm-tuning/</guid>
      <description>&lt;h1 id=&#34;77-jvm-调优永远排在最后&#34;&gt;7.7 JVM 调优：永远排在最后&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;上一节：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/07-optimization-and-validation/06-pooling/&#34;&gt;7.6 池化与复用&lt;/a&gt;　|　下一节：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/07-optimization-and-validation/08-optimization-discipline/&#34;&gt;7.8 优化的三问纪律&lt;/a&gt;
配套代码：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/code/07-optimization-and-validation/07-jvm-tuning/&#34;&gt;07-optimization-and-validation/07-jvm-tuning&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一句话结论&#34;&gt;一句话结论&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;JVM 调优是「榨取最后几个百分点」的手段，不是解决性能问题的方法。&lt;/strong&gt; 它的收益通常是个位数百分比，而验证成本高、风险大（可能让吞吐下降而延迟只改善一点）。所以它&lt;strong&gt;永远排在最后&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一用修车理解-jvm-调优的顺序&#34;&gt;一、用「修车」理解 JVM 调优的顺序&lt;/h2&gt;
&lt;p&gt;车开得慢，你会先检查什么？&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;顺序&lt;/th&gt;
					&lt;th&gt;检查项&lt;/th&gt;
					&lt;th&gt;对应&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;1&lt;/td&gt;
					&lt;td&gt;轮胎气压是否正常&lt;/td&gt;
					&lt;td&gt;代码合理性（有没有明显的浪费）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;2&lt;/td&gt;
					&lt;td&gt;是不是一直踩着刹车&lt;/td&gt;
					&lt;td&gt;有没有阻塞、排队&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;3&lt;/td&gt;
					&lt;td&gt;油路是否通畅&lt;/td&gt;
					&lt;td&gt;数据库、网络是否正常&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;4&lt;/td&gt;
					&lt;td&gt;驾驶习惯&lt;/td&gt;
					&lt;td&gt;架构、并发模型&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;最后&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;调 ECU（发动机控制单元）&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;JVM 参数&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;如果你先调 ECU，而轮胎没气&lt;/strong&gt;——你会花几天时间，最后发现没用。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;二jvm-调优能做什么不能做什么&#34;&gt;二、JVM 调优能做什么、不能做什么&lt;/h2&gt;
&lt;h3 id=&#34;能做的&#34;&gt;能做的&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;目标&lt;/th&gt;
					&lt;th&gt;手段&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;降低 GC 停顿&lt;/td&gt;
					&lt;td&gt;换低停顿 GC（ZGC/Shenandoah）、调堆、调 region 大小&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;提高吞吐&lt;/td&gt;
					&lt;td&gt;换 Parallel GC、加大堆&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;降低冷启动时间&lt;/td&gt;
					&lt;td&gt;AppCDS、减少类加载&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;减少内存占用&lt;/td&gt;
					&lt;td&gt;调堆、调元空间&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;不能做的&#34;&gt;不能做的&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;错误期望&lt;/th&gt;
					&lt;th&gt;现实&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;解决「N+1 导致的慢」&lt;/td&gt;
					&lt;td&gt;GC 参数与查询次数无关&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;解决「连接池排队」&lt;/td&gt;
					&lt;td&gt;与 GC 无关&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;解决「锁竞争」&lt;/td&gt;
					&lt;td&gt;换 GC 不会减少锁竞争（可能更糟）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;解决「下游慢」&lt;/td&gt;
					&lt;td&gt;完全不相关&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;「让代码更快」&lt;/td&gt;
					&lt;td&gt;JIT 已经做了优化，参数影响有限&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;一句话&lt;/strong&gt;：&lt;strong&gt;JVM 调优只影响「同一份代码的执行效率」，不影响「代码做了多少工作」。&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>优化的三问纪律与收益报告</title>
      <link>https://www.dorkytiger.top/kotlin/kotlin-benchmark/07-optimization-and-validation/08-optimization-discipline/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.dorkytiger.top/kotlin/kotlin-benchmark/07-optimization-and-validation/08-optimization-discipline/</guid>
      <description>&lt;h1 id=&#34;78-优化的三问纪律与收益报告&#34;&gt;7.8 优化的三问纪律与收益报告&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;上一节：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/07-optimization-and-validation/07-jvm-tuning/&#34;&gt;7.7 JVM 调优&lt;/a&gt;　|　下一节：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/07-optimization-and-validation/09-lab7/&#34;&gt;7.9 Lab 7&lt;/a&gt;
配套代码：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/code/07-optimization-and-validation/08-optimization-discipline/&#34;&gt;07-optimization-and-validation/08-optimization-discipline&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一句话结论&#34;&gt;一句话结论&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;每一项优化都必须回答三个问题&lt;/strong&gt;：提升多少？代价是什么？回归验证了吗？——&lt;strong&gt;答不出第三个问题的优化，本质上是技术债，而不是优化。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一用报销凭证理解三问&#34;&gt;一、用「报销凭证」理解三问&lt;/h2&gt;
&lt;p&gt;公司报销，你需要三样东西：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;报销&lt;/th&gt;
					&lt;th&gt;优化&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;发票&lt;/strong&gt;（花了多少）&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;提升多少&lt;/strong&gt;（before/after 数据）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;用途说明&lt;/strong&gt;（为什么花）&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;代价是什么&lt;/strong&gt;（复杂度、风险、成本）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;审批记录&lt;/strong&gt;（谁批的）&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;回归验证了吗&lt;/strong&gt;（功能 + 性能 + 长稳）&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;缺一样都不能报销&lt;/strong&gt;——性能优化也一样：&lt;strong&gt;缺了&amp;quot;回归验证&amp;quot;，这次改动就是一笔没有凭证的开销&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;二三问详解&#34;&gt;二、三问详解&lt;/h2&gt;
&lt;h3 id=&#34;第一问提升多少&#34;&gt;第一问：提升多少？&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;必须给出&lt;/strong&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;| 指标 | before | after | 变化 | 显著性 |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;| --- | --- | --- | --- | --- |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;| P50 | 20.1 ms | 8.3 ms | -58.7% | p=0.008 ✅ |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;| P99 | 210.4 ms | 95.2 ms | -54.7% | p=0.008 ✅ |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;| QPS | 498 | 499 | +0.2% | 不显著 |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;| 错误率 | 0.05% | 0.03% | -0.02pp | — |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;环境噪声底线：P99 ±13.2%，MDD ±26.4%
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;结论：改善 54.7%，远超 MDD，可信
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;三个要点&lt;/strong&gt;：&lt;/p&gt;</description>
    </item>
    <item>
      <title>Lab 7：优化 Lab 6 找到的瓶颈</title>
      <link>https://www.dorkytiger.top/kotlin/kotlin-benchmark/07-optimization-and-validation/09-lab7/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.dorkytiger.top/kotlin/kotlin-benchmark/07-optimization-and-validation/09-lab7/</guid>
      <description>&lt;h1 id=&#34;79-lab-7优化-lab-6-找到的瓶颈&#34;&gt;7.9 Lab 7：优化 Lab 6 找到的瓶颈&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;上一节：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/07-optimization-and-validation/08-optimization-discipline/&#34;&gt;7.8 优化的三问纪律&lt;/a&gt;　|　下一节：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/08-continuous-performance/&#34;&gt;第 8 章 持续化&lt;/a&gt;
配套代码：&lt;a href=&#34;https://www.dorkytiger.top/kotlin/kotlin-benchmark/code/07-optimization-and-validation/09-lab7/&#34;&gt;07-optimization-and-validation/09-lab7&lt;/a&gt;
预计时长：&lt;strong&gt;90 分钟&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一这个-lab-的目标&#34;&gt;一、这个 Lab 的目标&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;对 Lab 6 找到的三个瓶颈，实施优化并完成三问验证。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;关键的训练点不是「会改代码」，而是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;按优先级排序&lt;/strong&gt;（先改哪个？）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;一次只改一处&lt;/strong&gt;（否则无法归因）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;每处都做三问验证&lt;/strong&gt;（提升多少、代价、回归）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;至少否决一项&lt;/strong&gt;（比如&amp;quot;加缓存&amp;quot;）&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;二任务清单&#34;&gt;二、任务清单&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;#&lt;/th&gt;
					&lt;th&gt;任务&lt;/th&gt;
					&lt;th&gt;产出&lt;/th&gt;
					&lt;th&gt;时长&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;1&lt;/td&gt;
					&lt;td&gt;列出候选优化并排序&lt;/td&gt;
					&lt;td&gt;优先级清单&lt;/td&gt;
					&lt;td&gt;15 min&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;2&lt;/td&gt;
					&lt;td&gt;实施优化 1（减少工作类）&lt;/td&gt;
					&lt;td&gt;before/after 数据&lt;/td&gt;
					&lt;td&gt;25 min&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;3&lt;/td&gt;
					&lt;td&gt;实施优化 2（架构/并发类）&lt;/td&gt;
					&lt;td&gt;before/after 数据&lt;/td&gt;
					&lt;td&gt;25 min&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;4&lt;/td&gt;
					&lt;td&gt;评估并否决一项优化&lt;/td&gt;
					&lt;td&gt;否决记录&lt;/td&gt;
					&lt;td&gt;10 min&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;5&lt;/td&gt;
					&lt;td&gt;写优化收益报告&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;OPTIMIZATION.md&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;15 min&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&#34;三任务-1候选优化与排序&#34;&gt;三、任务 1：候选优化与排序&lt;/h2&gt;
&lt;p&gt;针对 Lab 6 的三个瓶颈，列出候选优化：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;瓶颈&lt;/th&gt;
					&lt;th&gt;候选优化&lt;/th&gt;
					&lt;th&gt;金字塔层级&lt;/th&gt;
					&lt;th&gt;预期收益&lt;/th&gt;
					&lt;th&gt;代价&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;/slow-cpu&lt;/code&gt;（重复编译正则）&lt;/td&gt;
					&lt;td&gt;① 把 Regex 提到顶层（编译一次）&lt;/td&gt;
					&lt;td&gt;② 算法/IO&lt;/td&gt;
					&lt;td&gt;高&lt;/td&gt;
					&lt;td&gt;极低&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;② 缓存 findAll 的结果&lt;/td&gt;
					&lt;td&gt;④ 缓存&lt;/td&gt;
					&lt;td&gt;中&lt;/td&gt;
					&lt;td&gt;一致性（数据变化）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;③ 减少正则匹配次数（改算法）&lt;/td&gt;
					&lt;td&gt;② 算法&lt;/td&gt;
					&lt;td&gt;高&lt;/td&gt;
					&lt;td&gt;中（需理解业务）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;/slow-io&lt;/code&gt;（Default 上阻塞）&lt;/td&gt;
					&lt;td&gt;① 切到 &lt;code&gt;Dispatchers.IO&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;③ 架构/并发&lt;/td&gt;
					&lt;td&gt;高&lt;/td&gt;
					&lt;td&gt;低&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;② 改用异步驱动&lt;/td&gt;
					&lt;td&gt;③ 架构/并发&lt;/td&gt;
					&lt;td&gt;高&lt;/td&gt;
					&lt;td&gt;高（改驱动）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;③ 加信号量限制并发&lt;/td&gt;
					&lt;td&gt;③ 架构/并发&lt;/td&gt;
					&lt;td&gt;中&lt;/td&gt;
					&lt;td&gt;低&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;/slow-db&lt;/code&gt;（N+1）&lt;/td&gt;
					&lt;td&gt;① 改成批量查询&lt;/td&gt;
					&lt;td&gt;② 算法/IO&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;极高&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;低&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;② 加缓存&lt;/td&gt;
					&lt;td&gt;④ 缓存&lt;/td&gt;
					&lt;td&gt;中&lt;/td&gt;
					&lt;td&gt;一致性风险&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;③ 加索引&lt;/td&gt;
					&lt;td&gt;② 算法/IO&lt;/td&gt;
					&lt;td&gt;中&lt;/td&gt;
					&lt;td&gt;低&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;排序原则&lt;/strong&gt;（第 7.1 节）：&lt;strong&gt;先做「减少工作」和「架构」层，缓存和常数最后。&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
