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
Ôn lại trước khi học
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
- Cài module lõi (phần chứa thuật toán chính) thay cho stub.
- 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).
- 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
bench/chạy lõi trên 3 cỡ dữ liệu (nhỏ, vừa, đúng cỡ yêu cầuN). Ghi CSV kèm thông tin máy.- Tách thời gian đọc dữ liệu khỏi thời gian thuật toán.
- 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)
- Profile bằng
perf/gprof(C++),py-spy/cProfile(Python), hoặcpprof(Go). Lưu flame graph. - Liệt kê 3 hàm tốn thời gian nhất.
- 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 ...
- 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.mdcó 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
- Module lõi là gì?
- Baseline để làm gì?
- Profiling tìm cái gì?
- 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.