Q

Quản trị viên

Là một lập trình viên yêu công nghệ, thích viết blog để chia sẻ kiến thức, kinh nghiệm lập trình và những điều thú vị trong thế giới tech.

2300 bài viết · Website
Giải thuật 03/09/2026 9 phút

8 triệu bản sao của 1000 chuỗi: interning cắt 732 MB xuống 30

Giữ nhiều bản sao của cùng một chuỗi thì tốn gì đâu? Tôi đo thử: 8 triệu tham chiếu tới chỉ 1000 giá trị duy nhất, nếu mỗi nơi giữ một bản riêng tốn 732 MB, còn interning (một bản duy nhất + chỉ số 4 byte) chỉ 30,8 MB — ít hơn 24 lần. Chưa hết: interning còn biến so sánh bằng thành so một số nguyên O(1), nhanh hơn 6,4 lần so từng ký tự.

Giải thuật 03/09/2026 10 phút

Free lẻ mà vẫn nhanh 5,7 lần malloc: mẹo free list

Arena nhanh nhưng không free lẻ được — muốn free từng cái thì đành quay lại malloc? Tôi đo thử: một pool free list cấp và free từng ô O(1) bằng cách xâu các ô trống vào một danh sách liên kết, churn nhanh gấp 5,7 lần malloc/free. Hay nhất là con trỏ next nhúng ngay trong ô trống nên tốn 0 byte thừa.

Giải thuật 03/09/2026 9 phút

Bao nhiêu luồng là đủ? 10 lõi mà 80 luồng vẫn nhanh gấp 8 — tùy việc bạn làm

Tưởng nhiều luồng thì luôn nhanh hơn, hay cứ đặt số luồng bằng số lõi? Tôi đo hai loại việc trái ngược: việc thuần CPU chững ở ~nproc (thêm luồng vô ích), còn việc chờ-bound thì tối ưu vượt xa nproc — 80 luồng trên 10 lõi vẫn cho throughput gấp 8 lần vì luồng ngủ không chiếm lõi. Không có số luồng vàng.

Hệ điều hành 03/09/2026 10 phút

Nạp lại một trang từ swap chậm hơn RAM 58 lần — trong khi mọi bộ đếm khăng khăng 'chẳng có gì xảy ra'

Đọc lại một trang vừa bị đẩy ra swap tốn ~704 ns, chậm hơn đọc RAM 58 lần. Nhưng bộ đếm ru_majflt và pswpin đều báo 0 — chúng nói sự kiện tôi định đo không tồn tại, trong khi VmSwap và đồng hồ nói ngược lại. Tin đồng hồ hơn bộ đếm. Đo thật bằng MADV_PAGEOUT.

Giải thuật 03/09/2026 10 phút

free() rồi mà RAM không trả về: sự thật về phân mảnh heap

free() xong là bộ nhớ trả về hệ điều hành ngay? Tôi đo thử: sau khi free 90% của 4 triệu ô nhỏ, RSS vẫn giữ 655 MB trong khi dữ liệu sống chỉ 55 MB — gấp 12 lần. Tệ hơn, những hố nhỏ rời rạc không lấp được request lớn hơn: cấp lại các ô 512B làm heap phình thêm 563 MB, còn cùng cỡ thì tái dùng đúng hố, +0 MB.

Giải thuật 03/09/2026 8 phút

Ma trận kề nhìn gọn mà ngốn RAM 127 lần: bẫy đồ thị thưa

Ma trận kề đơn giản nên cứ dùng? Tôi đo thử: với đồ thị thưa (đa số thực tế), ma trận tốn RAM gấp 127 lần và duyệt chậm 302 lần vì phải quét cả V² ô. Danh sách kề chỉ lưu cạnh thật. Nhưng ma trận lại thắng khi cần hỏi 'có cạnh (i,j) không' — O(1). Chọn theo mật độ đồ thị.