Dự án cuối 2: benchmark và profiling

Xây module lõi dự án cuối khóa, benchmark hiệu năng, profiling tìm bottleneck và tối ưu có số liệu trước sau.
Chuyên giaThuật toán ~120 phút

Giới thiệu

Bạn xây module lõi rồi đo tốc độ. Mọi nhận định phải có số liệu.

Kiến thức cần nhớ

Module lõi đúng trước

  • Lõi là phần quan trọng nhất của dự án.
  • Chạy đúng trên dữ liệu mẫu nhỏ trước.
  • Ví dụ đời thường: giống xây móng nhà trước khi lên tầng.
  • Kèm kiểm thử biên như rỗng và một phần tử.

Benchmark và baseline

  • Benchmark là khung đo tốc độ chuẩn.
  • Baseline là số đo lần đầu để so sánh.
  • Ví dụ đời thường: giống cân lần đầu trước khi giảm cân.
  • Tách thời gian thuật toán khỏi đọc file.

Profiling và tối ưu

  • Profiling tìm 3 hàm tốn thời gian nhất.
  • Sửa thuật toán trước, sửa hằng số sau.
  • Ví dụ đời thường: giống tìm đoạn kẹt xe nhất để mở đường.
  • Đo lại sau sửa, tệ hơn thì hoàn tác.
# đo thời gian chạy hàm
import time  # đồng hồ đo
bat_dau = time.time()  # mốc bắt đầu
sum(range(1000))  # hàm cần đo
print(time.time() - bat_dau)  # thời gian chạy

Ví dụ

  • 5 kiểm thử biên -> xanh hết trên dữ liệu mẫu.
  • Chạy benchmark hai lần -> chênh lệch dưới 15%.

💻 Bài tập

Dự án cuối, ngày 2. Nộp vào repo final-project/.

Bài 1: Cài đặt lõi

  1. Cài module lõi (phần chứa thuật toán chính) thay cho stub.
  2. Test đơn vị cho lõi: ca thường, ca biên (rỗng, 1 phần tử, dữ liệu trùng, dữ liệu rất lớn), ca lỗi (input sai).
  3. Test "vàng": 5 input nhỏ có đáp án tính tay, lưu thành file và so tự động.

Bài 2: Benchmark và baseline

  1. bench/ chạy lõi trên 3 cỡ dữ liệu (nhỏ, vừa, đúng cỡ yêu cầu N). Ghi CSV kèm thông tin máy.
  2. Tách thời gian đọc dữ liệu khỏi thời gian thuật toán.
  3. Ghi baseline vào BENCHMARK.md. So với yêu cầu phi chức năng: đạt hay chưa, thiếu bao nhiêu.

Bài 3: Profile và tối ưu (nâng cao)

  1. Profile bằng perf/gprof (C++), py-spy/cProfile (Python), hoặc pprof (Go). Lưu flame graph.
  2. Liệt kê 3 hàm tốn thời gian nhất.
  3. Tối ưu theo thứ tự: thuật toán, cấu trúc dữ liệu, rồi mới tới hằng số. Mỗi lần sửa 1 thứ, đo lại, ghi vào bảng:
thay_đổi                          p95_trước   p95_sau   giữ_hay_bỏ
đổi list sang heap                ...
bỏ copy chuỗi trong vòng lặp      ...
  1. Sửa nào làm chậm hơn thì hoàn tác và ghi lại.

✅ Tiêu chí hoàn thành

  • Test đơn vị và test vàng pass, CI xanh.
  • BENCHMARK.md có baseline so với yêu cầu.
  • Có flame graph và bảng tối ưu từng bước.
  • Mọi thay đổi tối ưu có số đo trước và sau.

❓ Câu hỏi ôn tập

  1. Module lõi là gì?
  2. Baseline để làm gì?
  3. Profiling tìm cái gì?
  4. Sửa thuật toán trước hay hằng số trước?

🌕 Bạn đã hoàn thành ngày 168. Làm hết bài tập phía trên rồi sang ngày tiếp theo.

Bớt paste mù, hiểu sâu từng dòng mình viết.

180 Days Challenge. 180 ngày cai nghiện vibe code.