Elysia / Hono
Elysia vs Hono กับ PostgreSQL บน MacBook Air M5
สวัสดีครับ กลับมาจับ MacBook Air M5 มาทรมานเป็นรอบที่สาม 😅
โพสต์แรก ผมวัดว่า Bun HTTP Framework แปดตัวเร็วแค่ไหน แล้วพบว่าตัวเองกำลังวัดความร้อนของเครื่องมากกว่าวัด Framework โพสต์ที่สอง ผมวัดพลังงานต่อ Request แล้วพบว่าตัวยิงโหลดกินไฟมากกว่า Server ที่กำลังทดสอบ
ทั้งสองโพสต์มีจุดอ่อนเดียวกันข้อหนึ่ง ซึ่งผมเขียนทิ้งไว้เองว่า:
Handler ใน Benchmark แทบไม่มีงาน ถ้า Handler ต้องรอ Database จริง ความต่างระดับเศษมิลลิจูลตรงนี้อาจเล็กมากเมื่อเทียบกับเวลา Query
รอบนี้ผมเลยเอาข้อนั้นมาทดสอบจริง ๆ ด้วยคำถามว่า:
ถ้าให้ Elysia กับ Hono คุยกับ PostgreSQL ก้อนเดียวกัน ด้วย SQL ชุดเดียวกัน ความต่างที่เคยเห็นจะเหลืออยู่เท่าไหร่?
คำตอบสั้น ๆ คือ เหลือน้อยจนวัดไม่ได้ครับ
สรุปก่อน เผื่อยังไม่อยากอ่านยาว
- ห่างกันมากที่สุดใน 16 ช่องทดสอบคือ 1.75% (get-user ที่ 100 connections) ค่ากลางของความต่างอยู่ที่ 0.34%
- ทุกช่องทดสอบ ช่วง min–max จาก 5 รอบของสอง Framework ทับกันหมด ไม่มีช่องไหนแยกออกจากกันได้เลย
- รันซ้ำ 5 รอบในเงื่อนไขเดียวกันเป๊ะ ๆ ยังแกว่างกันเองเฉลี่ย 2.94% และแย่สุด 12.67% — มากกว่าความต่างระหว่าง Framework
- คอขวดไม่ใช่ router: CPU ของ API ตันอยู่ราว 113% (ประมาณ 1.1 คอร์) ตั้งแต่ 10 connections ขึ้นไป ขณะที่ PostgreSQL พุ่งถึง 180–430%
- Workload ฝั่งอ่านยังไปต่อได้ถึง 100 connections แต่ฝั่งเขียนตันที่ 10 connections แล้วนิ่ง
- 160 trials, 175 ล้าน Request, HTTP และ transport error ศูนย์ ทุก trial
- ตัวเลขทั้งหมดเป็นผลบนเครื่องเดียว ไม่ใช่การจัดอันดับ Framework และไม่ใช่ตัวเลขจาก Production
ผมวัดอะไร บนอะไร
สี่ workload ที่แตะฐานข้อมูลจริง ไม่ใช่ route ที่ตอบ "hi" เฉย ๆ:
| Workload | ทำอะไร |
|---|---|
get-user |
หา user 42424 ด้วย primary key |
list-users |
ดึง 20 user ล่าสุด |
user-orders |
ดึง user พร้อม order ไม่เกิน 20 รายการ (user คนนี้มี 12 order) |
create-order |
transaction สร้าง order พร้อม 3 items |
ฐานข้อมูลตั้งต้นมี 100,000 users, 1,000,000 orders และ 3,000,000 order_items สร้างจาก MD5 counter-based generator ด้วย seed 424242 ทุกครั้ง และรัน ANALYZE หลัง seed เสร็จ ที่สำคัญคือ ผมไม่ tune PostgreSQL เลย ใช้ค่าที่ Homebrew ติดตั้งมาให้ตรง ๆ เพราะถ้า tune แล้วผลดีขึ้น เราจะไม่รู้ว่าดีขึ้นเพราะ Framework หรือเพราะ config
ทั้งสอง Framework ใช้ database functions, validation, JSON serialization และ connection pool ขนาด 10 ชุดเดียวกันทุกบรรทัด ต่างกันแค่ Elysia ใช้ native listen ส่วน Hono ใช้ Bun.serve เปิด production mode ไม่มี access log ไม่มี cache middleware
ผมทดสอบอย่างไร?
Concurrency 1, 10, 50 และ 100 อย่างละ 5 รอบต่อ Framework รวมเป็น 160 trials วัดจริงรอบละ 30 วินาที
ทุก trial ผ่านขั้นตอนเดิมหมด: ลบและ seed ฐานข้อมูลใหม่ → เปิด API → warm-up ให้ครบ 1,000 request ที่สำเร็จ → พัก 5 วินาที → วัด 30 วินาที → ปิด API → cooldown 15 วินาที
ทำไมต้อง seed ฐานข้อมูลใหม่ทุก trial?
เพราะ create-order เขียนข้อมูลลงไปจริง ถ้าไม่ reset ตารางจะโตขึ้นเรื่อย ๆ ตาม trial ที่ผ่านมา แล้ว Framework ที่บังเอิญรันทีหลังจะเจอฐานข้อมูลที่ใหญ่กว่า — กลายเป็นว่าเราวัดลำดับการรัน ไม่ได้วัด Framework
เรื่องนี้ผมเข็ดมาจากโพสต์แรกแล้วครับ ตอนนั้นแค่สลับลำดับรายการทดสอบ อันดับก็พลิกทันที รอบนี้จึงสลับ Framework ที่เริ่มก่อนแบบ deterministic และจับคู่ให้รันติดกัน เพื่อให้ถ้าเครื่องร้อนขึ้น มันร้อนใส่ทั้งคู่เท่า ๆ กัน
ทั้ง 160 trials รันบน MacBook Air (Mac17,3) เครื่องเดียว — ชิป Apple M5 10 คอร์ แรม 24 GB unified — เสียบปลั๊กไฟไว้ตลอดการทดสอบ ส่วนเวอร์ชันของ Bun, PostgreSQL, Elysia, Hono และ bombardier ในตารางข้างล่าง เป็นค่าที่อ่านจากเครื่องตอนรันจริง ไม่ได้พิมพ์เอง
ลิงก์ชื่อรุ่นด้านบนเป็นลิงก์ Lazada affiliate ครับ กดซื้อผ่านลิงก์นี้ราคาไม่ต่างจากเดิม แต่บล็อกจะได้ค่าคอมมิชชันเล็กน้อย
สภาพแวดล้อมที่บันทึกจริง
Session: 2026-09-12T14-24-22-067Z-full-4423a21a
2026-09-12T14:24:22.067Z — 2026-09-12T17:03:10.238Z
| รายการ | ค่าที่บันทึก |
|---|---|
| macOS | ProductName: macOS ProductVersion: 26.6.2 BuildVersion: 25G83 |
| CPU / RAM | Apple M5 / 24 GiB |
| Bun / PostgreSQL | 1.4.0 / 18.6 |
| Elysia / Hono | 1.4.30 / 4.13.7 |
| Bombardier | 2.0.2 |
| Homebrew formula | postgresql@18 18.6 |
ค่า PostgreSQL ที่ใช้
| Setting | Value | Unit |
|---|---|---|
autovacuum | on | — |
checkpoint_completion_target | 0.9 | — |
checkpoint_timeout | 300 | s |
effective_cache_size | 524288 | 8kB |
fsync | on | — |
full_page_writes | on | — |
jit | on | — |
listen_addresses | localhost | — |
maintenance_work_mem | 65536 | kB |
max_connections | 100 | — |
max_parallel_workers_per_gather | 2 | — |
max_wal_size | 1024 | MB |
min_wal_size | 80 | MB |
port | 5432 | — |
random_page_cost | 4 | — |
seq_page_cost | 1 | — |
server_version | 18.6 (Homebrew) | — |
shared_buffers | 16384 | 8kB |
synchronous_commit | on | — |
wal_level | replica | — |
work_mem | 4096 | kB |
Throughput ที่สำเร็จ
แต่ละจุดใช้ครบ 5 repetitions แกนตั้งของกราฟเส้นไม่ได้เริ่มที่ศูนย์เสมอ โปรดเทียบค่าจริงในตารางด้วย
get-user
| c | Framework | Median req/s | Min–max req/s | Mean ms¹ | p50 ms¹ | p95 ms¹ | p99 ms¹ | Max ms |
|---|---|---|---|---|---|---|---|---|
| 1 | elysia | 18,116.69 | 17,904.51–18,156.69 | 0.05 | 0.05 | 0.06 | 0.07 | 1.19 |
| 1 | hono | 18,072.89 | 17,854.94–18,078.03 | 0.05 | 0.05 | 0.06 | 0.07 | 1.15 |
| 10 | elysia | 59,488.29 | 58,539.61–59,962.34 | 0.17 | 0.16 | 0.23 | 0.42 | 14.46 |
| 10 | hono | 59,063.29 | 57,972.6–59,881.68 | 0.17 | 0.16 | 0.23 | 0.41 | 7.47 |
| 50 | elysia | 69,802.47 | 68,458.74–70,324.56 | 0.71 | 0.67 | 1.16 | 1.4 | 10.28 |
| 50 | hono | 69,065.91 | 67,742.16–69,686.02 | 0.72 | 0.68 | 1.16 | 1.39 | 9.91 |
| 100 | elysia | 72,531.63 | 70,665.31–72,922.91 | 1.38 | 1.3 | 2.1 | 2.49 | 9.09 |
| 100 | hono | 71,282.64 | 69,633.05–71,636.7 | 1.4 | 1.33 | 2.12 | 2.49 | 8.78 |
list-users
| c | Framework | Median req/s | Min–max req/s | Mean ms¹ | p50 ms¹ | p95 ms¹ | p99 ms¹ | Max ms |
|---|---|---|---|---|---|---|---|---|
| 1 | elysia | 12,946.76 | 12,859.88–13,039.77 | 0.08 | 0.08 | 0.08 | 0.09 | 1.17 |
| 1 | hono | 12,902.49 | 12,649.06–13,033.39 | 0.08 | 0.08 | 0.08 | 0.09 | 1.1 |
| 10 | elysia | 39,839.62 | 39,085.66–39,958.8 | 0.25 | 0.24 | 0.34 | 0.58 | 7.1 |
| 10 | hono | 39,819.01 | 38,995.98–40,070.06 | 0.25 | 0.24 | 0.34 | 0.55 | 4.82 |
| 50 | elysia | 44,620.14 | 43,576.32–45,283.24 | 1.12 | 1.06 | 1.75 | 2.1 | 12.47 |
| 50 | hono | 43,995 | 43,034.77–44,385.07 | 1.13 | 1.08 | 1.76 | 2.12 | 20.12 |
| 100 | elysia | 45,950.09 | 44,593.55–46,587.26 | 2.17 | 2.11 | 3.15 | 3.69 | 29.07 |
| 100 | hono | 45,773.26 | 44,599.43–46,369.85 | 2.18 | 2.12 | 3.13 | 3.66 | 11.45 |
user-orders
| c | Framework | Median req/s | Min–max req/s | Mean ms¹ | p50 ms¹ | p95 ms¹ | p99 ms¹ | Max ms |
|---|---|---|---|---|---|---|---|---|
| 1 | elysia | 11,151.3 | 11,127.56–11,240.41 | 0.09 | 0.09 | 0.1 | 0.11 | 1.63 |
| 1 | hono | 11,181.5 | 11,099.48–11,257.17 | 0.09 | 0.09 | 0.09 | 0.11 | 1.54 |
| 10 | elysia | 44,112.4 | 42,927.47–44,267.83 | 0.23 | 0.21 | 0.31 | 0.52 | 69.1 |
| 10 | hono | 44,167.55 | 43,060.34–44,204.13 | 0.23 | 0.21 | 0.31 | 0.5 | 7.53 |
| 50 | elysia | 51,425.96 | 49,893.8–51,789.76 | 0.97 | 0.92 | 1.67 | 2.15 | 72.93 |
| 50 | hono | 50,699.66 | 49,607.03–51,327.84 | 0.98 | 0.93 | 1.64 | 2.1 | 82.45 |
| 100 | elysia | 52,884.08 | 51,330.82–53,249.39 | 1.89 | 1.56 | 4.41 | 6.52 | 84.22 |
| 100 | hono | 52,749.22 | 51,372.99–52,992.27 | 1.89 | 1.59 | 4.05 | 6.43 | 115.02 |
create-order
| c | Framework | Median req/s | Min–max req/s | Mean ms¹ | p50 ms¹ | p95 ms¹ | p99 ms¹ | Max ms |
|---|---|---|---|---|---|---|---|---|
| 1 | elysia | 4,725.46 | 4,720.22–4,762.51 | 0.21 | 0.21 | 0.23 | 0.25 | 14.18 |
| 1 | hono | 4,740.17 | 4,714.33–4,748.77 | 0.21 | 0.21 | 0.22 | 0.26 | 37.07 |
| 10 | elysia | 20,458.75 | 19,908.35–20,657.98 | 0.49 | 0.45 | 0.65 | 0.84 | 85.19 |
| 10 | hono | 20,431.79 | 18,172.51–20,760.42 | 0.49 | 0.46 | 0.63 | 0.81 | 77.99 |
| 50 | elysia | 20,241.74 | 19,856.66–20,402.27 | 2.47 | 2.33 | 2.87 | 7.6 | 97.74 |
| 50 | hono | 20,308.72 | 19,887.44–20,520.36 | 2.46 | 2.31 | 2.8 | 8.11 | 87.1 |
| 100 | elysia | 19,912.81 | 19,335.74–20,127.68 | 5.02 | 4.89 | 5.59 | 9.96 | 106.28 |
| 100 | hono | 20,017.78 | 19,689.06–20,268.39 | 4.99 | 4.81 | 5.43 | 9.85 | 87.63 |
¹ Median ของสถิติแต่ละ trial ไม่ใช่ latency distribution รวม HTTP และ transport errors เป็นศูนย์ทุก trial ที่รวมผล ค่าที่ไม่มีแสดง N/A
การใช้ทรัพยากรจาก samples
แสดง median ของ repetitions โดย CPU หนึ่ง core เต็ม = 100% และ RSS เป็น sampled peak หน่วย MiB ผลรวม PostgreSQL อาจนับ shared pages ซ้ำ ค่านี้ไม่ได้ยืนยันว่าตัวสร้างโหลดไม่เป็นคอขวด
| Workload | c | Framework | API CPU % | Load CPU % | PG CPU % | API MiB | Load MiB | PG MiB |
|---|---|---|---|---|---|---|---|---|
| create-order | 1 | elysia | 37.73 | 15.86 | 37.55 | 68.77 | 20.31 | 1,284.67 |
| create-order | 1 | hono | 37.56 | 15.96 | 37.69 | 63.86 | 20.25 | 1,281.69 |
| create-order | 10 | elysia | 112.63 | 83.06 | 355.77 | 73.14 | 22.8 | 2,026.41 |
| create-order | 10 | hono | 112.73 | 83.69 | 355.82 | 68.25 | 22.58 | 2,028.14 |
| create-order | 50 | elysia | 111.97 | 92.86 | 354.51 | 77 | 23.44 | 2,028.09 |
| create-order | 50 | hono | 110.85 | 93.39 | 356.21 | 70.17 | 22.94 | 2,031.78 |
| create-order | 100 | elysia | 114.06 | 93.98 | 349.81 | 78.86 | 25.78 | 2,023.48 |
| create-order | 100 | hono | 114.19 | 94.56 | 352.79 | 73.08 | 25.5 | 2,026.8 |
| get-user | 1 | elysia | 53.13 | 77.3 | 20.58 | 62.91 | 40.97 | 806.02 |
| get-user | 1 | hono | 53.16 | 76.54 | 20.48 | 59.84 | 41.03 | 807.53 |
| get-user | 10 | elysia | 113.5 | 227.35 | 197.39 | 66.08 | 23.52 | 834.16 |
| get-user | 10 | hono | 113.01 | 226.08 | 195.58 | 58.81 | 23.58 | 832.09 |
| get-user | 50 | elysia | 108.6 | 336.1 | 191.51 | 70.11 | 24.8 | 915.86 |
| get-user | 50 | hono | 108.06 | 329.75 | 184.99 | 65.72 | 24.7 | 831.31 |
| get-user | 100 | elysia | 109.25 | 332.65 | 183.52 | 71.38 | 27.77 | 908.94 |
| get-user | 100 | hono | 108.17 | 322.34 | 181.08 | 65.88 | 27.89 | 916.75 |
| list-users | 1 | elysia | 50.29 | 59.22 | 27.23 | 64.41 | 40.8 | 819.34 |
| list-users | 1 | hono | 50.06 | 45.12 | 27.3 | 59.02 | 40.34 | 819.59 |
| list-users | 10 | elysia | 112.16 | 149.19 | 228.96 | 69.08 | 23.36 | 838.73 |
| list-users | 10 | hono | 110.98 | 149.49 | 227.62 | 60.91 | 23.53 | 837.92 |
| list-users | 50 | elysia | 115.2 | 202.32 | 215.14 | 80.08 | 24.75 | 910.45 |
| list-users | 50 | hono | 113.48 | 198.95 | 210.74 | 79.11 | 24.78 | 957.23 |
| list-users | 100 | elysia | 118.09 | 190.17 | 207.35 | 81.25 | 27.11 | 837.89 |
| list-users | 100 | hono | 116.23 | 189.73 | 207.52 | 78.78 | 27.28 | 834.69 |
| user-orders | 1 | elysia | 38.91 | 37.37 | 42.22 | 62.17 | 20.86 | 807.55 |
| user-orders | 1 | hono | 39.11 | 37.34 | 41.88 | 60.77 | 20.88 | 807.72 |
| user-orders | 10 | elysia | 114.79 | 161.78 | 391.24 | 66.38 | 23.48 | 948.92 |
| user-orders | 10 | hono | 114.04 | 161.91 | 391.21 | 60.33 | 23.52 | 944.58 |
| user-orders | 50 | elysia | 114.09 | 272.02 | 428.47 | 76.69 | 24.72 | 943.03 |
| user-orders | 50 | hono | 112.36 | 268.56 | 422.59 | 73.58 | 24.45 | 950.05 |
| user-orders | 100 | elysia | 115.07 | 287.08 | 423.59 | 77.44 | 27.7 | 970.06 |
| user-orders | 100 | hono | 114.05 | 285.14 | 421.66 | 73.83 | 27.7 | 952.77 |
ดาวน์โหลดข้อมูลตรวจสอบ
- Summary CSV
- Raw results เฉพาะข้อมูลตัวเลข ทุก warm-up และ measurement
- Protocol เวอร์ชัน source hashes และ configuration
ผลลัพธ์: เสมอกันจนแยกไม่ออก
ช่องที่ห่างกันมากที่สุดในทั้ง 16 ช่องคือ get-user ที่ 100 connections — 72,532 เทียบกับ 71,283 req/s คิดเป็น 1.75% ส่วนค่ากลางของความต่างทั้งหมดอยู่ที่ 0.34% และ Elysia นำในเชิงตัวเลข 11 จาก 16 ช่อง
ฟังดูเหมือน Elysia ชนะนิด ๆ ใช่ไหมครับ แต่อย่าเพิ่ง
ผมรันทุกช่อง 5 รอบ ในเงื่อนไขเดียวกันทุกอย่าง แล้ว 5 รอบนั้นแกว่างกันเองเฉลี่ย 2.94% และแย่สุดถึง 12.67% (create-order ที่ 10 connections) พูดอีกแบบคือ ถ้าผมรัน Framework เดียวกันสองครั้ง ผมอาจได้ผลต่างกันมากกว่าที่ Elysia ต่างจาก Hono เสียอีก
และทุกช่องทดสอบ ช่วง min–max ของสอง Framework ทับกันหมด ไม่มีช่องไหนเลยที่แยกออกจากกันได้
เพราะฉะนั้นโพสต์นี้ ไม่ประกาศผู้ชนะครับ ใครจะบอกว่า Elysia เร็วกว่า 1.75% ก็เอาตัวเลขนี้ไปอ้างไม่ได้ เพราะมันจมอยู่ใน noise ของเครื่องผมเอง
ถ้าไม่ใช่ router แล้วคอขวดอยู่ไหน?
ตัวเลข CPU ตอบได้ชัดกว่า throughput ครับ
CPU ของ API ตันอยู่ราว 113% หรือประมาณ 1.1 คอร์ ตั้งแต่ 10 connections ขึ้นไป ทุก workload — เพราะ Bun รัน process เดียว ขณะเดียวกัน PostgreSQL ใช้ 180–430% และตัว bombardier เองกิน 149–336% ใน workload ฝั่งอ่าน
สามตัวนี้แย่ง 10 คอร์ชุดเดียวกันอยู่ ดังนั้นที่อัตราระดับนี้ router ของทั้งสองตัวยังห่างไกลจากการเป็นข้อจำกัดมาก สิ่งที่ผมวัดได้จริง ๆ คือ PostgreSQL, Bun SQL client และ pool ที่แชร์กัน — ไม่ใช่ความเร็วของ Framework
นี่คือคำตอบของคำถามที่ผมทิ้งไว้ในโพสต์ก่อน: พอ handler ต้องรอฐานข้อมูลจริง ความต่างของ Framework ก็หายไปตามที่เดาไว้ครับ
ทำไม create-order ไม่ scale?
ฝั่งอ่านยังได้ throughput เพิ่มจาก 10 ไป 100 connections (get-user จาก 59,488 เป็น 72,532 req/s) แต่ฝั่งเขียนไม่เป็นอย่างนั้น
create-order ขึ้นสูงสุดที่ 10 connections ด้วย 20,459 req/s แล้วลดลงเล็กน้อยเป็น 19,913 ที่ 100 connections ยิ่งเพิ่ม connection ยิ่งได้น้อยลง
เหตุผลน่าจะตรงไปตรงมา: pool ตรึงไว้ที่ 10 connections ดังนั้นการเพิ่ม client เป็น 100 ไม่ได้เพิ่มงานที่ฐานข้อมูลทำได้ แค่เพิ่มคิวรอ บวกกับการเขียนทำให้ตารางโตขึ้นระหว่างวัด ซึ่งไม่ใช่คุณสมบัติของ Framework ไหนเลย
ก่อนนำตัวเลขไปอ้าง ขอฝากไว้ 7 ข้อ
- เครื่องเดียว ห้องเดียว คืนเดียว ตัวยิงโหลด API และ PostgreSQL อยู่บนเครื่องเดียวกัน แย่ง CPU และ thermal headroom กันเอง ความต่างที่เห็นจึงโยนให้ Framework ทั้งหมดไม่ได้
- ตัวยิงโหลดอยู่ในทุกตัวเลข bombardier กิน CPU 149–336% ใน workload ฝั่งอ่าน มันอาจเป็นคอขวดร่วมด้วย
- pool 10 connections เป็นเพดานที่ตั้งใจตรึง ผลที่ concurrency 50 และ 100 จึงบอกเรื่อง pool มากกว่าบอกเรื่อง Framework
- Workload เป็นแบบ hot-key และ warm-cache ยิง user คนเดิมซ้ำ ๆ ไม่ใช่ traffic สุ่มแบบของจริง และเป็น closed-loop ซึ่งซ่อนผลของ queueing เมื่อเทียบกับ fixed arrival rate
- ตัวเลข CPU กับ RSS เป็นค่าจาก sample เก็บประมาณวินาทีละครั้งจาก cumulative CPU time ไม่ใช่การบัญชีที่แม่นยำ และ RSS รวมของ PostgreSQL นับ shared pages ซ้ำได้
- percentile ในตารางเป็น median ของ percentile แต่ละ trial ไม่ใช่ percentile รวมของทุก request — อ่านผิดข้อนี้กันบ่อย
- cooldown 15 วินาทีไม่ได้รับประกันว่าเครื่องเย็นเท่ากันทุกรอบ ผมบันทึก thermal log ไว้และไม่เจอ warning แต่ “ไม่มี warning” ไม่เท่ากับ “อุณหภูมิคงที่”
และขอเปิดเผยเหมือนโพสต์ก่อน ๆ ครับ: ผมเคยมีส่วนร่วมกับเอกสารของ Elysia และรอบนี้ Elysia ก็นำในเชิงตัวเลข 11 จาก 16 ช่องอีก ใครนำผลไปใช้ควรรับรู้ความเกี่ยวข้องส่วนนี้ไว้ด้วย — ถึงผมจะสรุปเองว่าความต่างนี้วัดไม่ได้ก็ตาม
อยากลองทำซ้ำ เริ่มจากตรงนี้
ต้องใช้ Bun, PostgreSQL และ bombardier ตรงเวอร์ชันในตารางข้างบน พร้อม frozen lockfile และ source hashes ที่แนบมาใน manifest
bun install --frozen-lockfile
bun run typecheck
bun run test
bun run bench:run --profile quick --execute
bun run bench:run --profile full --execute
# ใช้ path ของ session ที่ runner พิมพ์ออกมาจริง ๆ:
bun run bench:report --session reports/runs/SESSION_ID
คำสั่งที่มี --execute จะลบและ seed ใหม่เฉพาะ benchmark_db ที่มี ownership marker ของโปรเจกต์นี้เท่านั้น และต้องเสียบปลั๊กไฟไว้ — runner เช็ก AC power ก่อนทุก trial ถ้าสลับไปใช้แบตเตอรี่มันจะหยุดทันที ซึ่ง session ก่อนหน้าของผมตายไปแล้วหนึ่งรอบตอน trial ที่ 71 ด้วยเหตุผลนี้เลยครับ
Full profile ใช้เวลาวัดจริง 80 นาที แต่รวม reset, warm-up, settle, cooldown และการตรวจทั้งหมดแล้วจบที่ 2 ชั่วโมง 39 นาที
ข้อมูลดิบทั้ง 160 trials, summary CSV และ manifest ที่ sanitize แล้ว ดาวน์โหลดได้จากลิงก์ในส่วนผลลัพธ์ข้างบน ถ้าไม่เห็นด้วยกับวิธีคิด throughput หรือการอ่าน percentile ของผม หยิบข้อมูลดิบไปคำนวณใหม่ได้เลยครับ
ส่วนที่ผมอยากให้ช่วยตรวจมากที่สุดคือ เพดานของ pool ครับ ผมยังไม่ได้ลองว่าถ้าขยาย pool จาก 10 เป็น 50 แล้ว create-order จะไปต่อได้ไหม หรือ PostgreSQL จะเป็นกำแพงอยู่ดี ถ้าใครมี Apple Silicon แล้วอยากลองซ้ำ ผมยินดีดูผลไปด้วยกันครับ